ListView custom items graphically incorrect
up vote
0
down vote
favorite
I have defined a custom item in XML for my ListView and I want every one of them to have five fields: three already visible
and the other two (telephone and Delete, see below) gone
until a click action is performed. The execution works, but graphically it's not what I was expecting.
The item is defined as follows:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt.name"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginStart="68dp"
android:layout_marginTop="16dp"
android:gravity="center_horizontal|center_vertical"
android:text="Name"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.surname"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="68dp"
android:gravity="center_horizontal|center_vertical"
android:layout_toEndOf="@id/txt.name"
android:text="Surname"
android:textAlignment="center"
android:textColor="@android:color/holo_blue_bright"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txt.id"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginStart="144dp"
android:layout_marginTop="64dp"
android:gravity="center_horizontal|center_vertical"
android:text="ID"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.tel"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginTop="64dp"
android:layout_marginEnd="40dp"
android:layout_toEndOf="@id/txt.id"
android:gravity="center_horizontal|center_vertical"
android:text="Tel"
android:visibility="gone"
android:textAlignment="center"
android:textSize="18sp" />
<Button
android:id="@+id/btn.delete"
android:layout_width="70dp"
android:layout_height="38dp"
android:layout_below="@id/txt.id"
android:layout_marginBottom="368dp"
android:layout_toEndOf="@id/txt.id"
android:visibility="gone"
android:text="Delete"
android:textAllCaps="false" />
</RelativeLayout>
and it gets properly inflated into the ListView, but when I click on the items, the txt.tel TextView
and the btn.delete Button
should appear on screen. The code I wrote is
ListView list= findViewById(R.id.advanced_list);
final StudentAdapter adapter= new StudentAdapter(
this,
R.layout.custom_list_item,
m.getStudents()
//this works fine, previous code omitted
);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tel= view.findViewById(R.id.txt_tel);
Button delete= view.findViewById(R.id.btn_delete);
int visible= tel.getVisibility();
//doesn't work
switch (visible){
case (View.VISIBLE):
tel.setVisibility(View.GONE);
delete.setVisibility(View.GONE);
break;
case (View.GONE):
tel.setVisibility(View.VISIBLE);
delete.setVisibility(View.VISIBLE);
break;
}
}
});
Graphically, what happens is this.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap. Hope I've been clear and someone can fix both my problems.
android android-studio
add a comment |
up vote
0
down vote
favorite
I have defined a custom item in XML for my ListView and I want every one of them to have five fields: three already visible
and the other two (telephone and Delete, see below) gone
until a click action is performed. The execution works, but graphically it's not what I was expecting.
The item is defined as follows:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt.name"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginStart="68dp"
android:layout_marginTop="16dp"
android:gravity="center_horizontal|center_vertical"
android:text="Name"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.surname"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="68dp"
android:gravity="center_horizontal|center_vertical"
android:layout_toEndOf="@id/txt.name"
android:text="Surname"
android:textAlignment="center"
android:textColor="@android:color/holo_blue_bright"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txt.id"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginStart="144dp"
android:layout_marginTop="64dp"
android:gravity="center_horizontal|center_vertical"
android:text="ID"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.tel"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginTop="64dp"
android:layout_marginEnd="40dp"
android:layout_toEndOf="@id/txt.id"
android:gravity="center_horizontal|center_vertical"
android:text="Tel"
android:visibility="gone"
android:textAlignment="center"
android:textSize="18sp" />
<Button
android:id="@+id/btn.delete"
android:layout_width="70dp"
android:layout_height="38dp"
android:layout_below="@id/txt.id"
android:layout_marginBottom="368dp"
android:layout_toEndOf="@id/txt.id"
android:visibility="gone"
android:text="Delete"
android:textAllCaps="false" />
</RelativeLayout>
and it gets properly inflated into the ListView, but when I click on the items, the txt.tel TextView
and the btn.delete Button
should appear on screen. The code I wrote is
ListView list= findViewById(R.id.advanced_list);
final StudentAdapter adapter= new StudentAdapter(
this,
R.layout.custom_list_item,
m.getStudents()
//this works fine, previous code omitted
);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tel= view.findViewById(R.id.txt_tel);
Button delete= view.findViewById(R.id.btn_delete);
int visible= tel.getVisibility();
//doesn't work
switch (visible){
case (View.VISIBLE):
tel.setVisibility(View.GONE);
delete.setVisibility(View.GONE);
break;
case (View.GONE):
tel.setVisibility(View.VISIBLE);
delete.setVisibility(View.VISIBLE);
break;
}
}
});
Graphically, what happens is this.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap. Hope I've been clear and someone can fix both my problems.
android android-studio
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have defined a custom item in XML for my ListView and I want every one of them to have five fields: three already visible
and the other two (telephone and Delete, see below) gone
until a click action is performed. The execution works, but graphically it's not what I was expecting.
The item is defined as follows:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt.name"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginStart="68dp"
android:layout_marginTop="16dp"
android:gravity="center_horizontal|center_vertical"
android:text="Name"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.surname"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="68dp"
android:gravity="center_horizontal|center_vertical"
android:layout_toEndOf="@id/txt.name"
android:text="Surname"
android:textAlignment="center"
android:textColor="@android:color/holo_blue_bright"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txt.id"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginStart="144dp"
android:layout_marginTop="64dp"
android:gravity="center_horizontal|center_vertical"
android:text="ID"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.tel"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginTop="64dp"
android:layout_marginEnd="40dp"
android:layout_toEndOf="@id/txt.id"
android:gravity="center_horizontal|center_vertical"
android:text="Tel"
android:visibility="gone"
android:textAlignment="center"
android:textSize="18sp" />
<Button
android:id="@+id/btn.delete"
android:layout_width="70dp"
android:layout_height="38dp"
android:layout_below="@id/txt.id"
android:layout_marginBottom="368dp"
android:layout_toEndOf="@id/txt.id"
android:visibility="gone"
android:text="Delete"
android:textAllCaps="false" />
</RelativeLayout>
and it gets properly inflated into the ListView, but when I click on the items, the txt.tel TextView
and the btn.delete Button
should appear on screen. The code I wrote is
ListView list= findViewById(R.id.advanced_list);
final StudentAdapter adapter= new StudentAdapter(
this,
R.layout.custom_list_item,
m.getStudents()
//this works fine, previous code omitted
);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tel= view.findViewById(R.id.txt_tel);
Button delete= view.findViewById(R.id.btn_delete);
int visible= tel.getVisibility();
//doesn't work
switch (visible){
case (View.VISIBLE):
tel.setVisibility(View.GONE);
delete.setVisibility(View.GONE);
break;
case (View.GONE):
tel.setVisibility(View.VISIBLE);
delete.setVisibility(View.VISIBLE);
break;
}
}
});
Graphically, what happens is this.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap. Hope I've been clear and someone can fix both my problems.
android android-studio
I have defined a custom item in XML for my ListView and I want every one of them to have five fields: three already visible
and the other two (telephone and Delete, see below) gone
until a click action is performed. The execution works, but graphically it's not what I was expecting.
The item is defined as follows:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txt.name"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginStart="68dp"
android:layout_marginTop="16dp"
android:gravity="center_horizontal|center_vertical"
android:text="Name"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.surname"
android:layout_width="120dp"
android:layout_height="40dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="68dp"
android:gravity="center_horizontal|center_vertical"
android:layout_toEndOf="@id/txt.name"
android:text="Surname"
android:textAlignment="center"
android:textColor="@android:color/holo_blue_bright"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txt.id"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginStart="144dp"
android:layout_marginTop="64dp"
android:gravity="center_horizontal|center_vertical"
android:text="ID"
android:textAlignment="center"
android:textSize="18sp" />
<TextView
android:id="@+id/txt.tel"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_marginTop="64dp"
android:layout_marginEnd="40dp"
android:layout_toEndOf="@id/txt.id"
android:gravity="center_horizontal|center_vertical"
android:text="Tel"
android:visibility="gone"
android:textAlignment="center"
android:textSize="18sp" />
<Button
android:id="@+id/btn.delete"
android:layout_width="70dp"
android:layout_height="38dp"
android:layout_below="@id/txt.id"
android:layout_marginBottom="368dp"
android:layout_toEndOf="@id/txt.id"
android:visibility="gone"
android:text="Delete"
android:textAllCaps="false" />
</RelativeLayout>
and it gets properly inflated into the ListView, but when I click on the items, the txt.tel TextView
and the btn.delete Button
should appear on screen. The code I wrote is
ListView list= findViewById(R.id.advanced_list);
final StudentAdapter adapter= new StudentAdapter(
this,
R.layout.custom_list_item,
m.getStudents()
//this works fine, previous code omitted
);
list.setAdapter(adapter);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView tel= view.findViewById(R.id.txt_tel);
Button delete= view.findViewById(R.id.btn_delete);
int visible= tel.getVisibility();
//doesn't work
switch (visible){
case (View.VISIBLE):
tel.setVisibility(View.GONE);
delete.setVisibility(View.GONE);
break;
case (View.GONE):
tel.setVisibility(View.VISIBLE);
delete.setVisibility(View.VISIBLE);
break;
}
}
});
Graphically, what happens is this.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap. Hope I've been clear and someone can fix both my problems.
android android-studio
android android-studio
asked Nov 22 at 17:01
davide m.
306
306
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
1
down vote
accepted
The execution works, but graphically it's not what I was expecting.
You set an attribute android:layout_marginBottom="368dp"
for the Button
, that's why the list item gets so huge.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap
This happens because the expanded item contains a (visible) Button
: if you leave out the Button
, then the item is "shrinkable". See for example this post on possible workarounds
Please note also that you're likely to encounter problems when scrolling because you change the ListView
items "from outside" (just test it with a large set of students). ListView
items should only be changed in getView()
and based on the current data for each position. So you should keep track of the expanded state of the rows in the Adapter, e.g. using a List<Boolean>
or better (for performance) a SparseBooleanArray
, and onClick()
change the corresponding data and call notifyDatasetChanged()
First, i really don't know the origin of that marginBottom... Sure must have been a design mistake. Second, thanks for the useful resource and for resolving my issue!
– davide m.
Nov 22 at 22:28
add a comment |
up vote
0
down vote
Change the root layout's height attribute from "match_parent" to "wrap_content"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"> ... </RelativeLayout>
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435522%2flistview-custom-items-graphically-incorrect%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
The execution works, but graphically it's not what I was expecting.
You set an attribute android:layout_marginBottom="368dp"
for the Button
, that's why the list item gets so huge.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap
This happens because the expanded item contains a (visible) Button
: if you leave out the Button
, then the item is "shrinkable". See for example this post on possible workarounds
Please note also that you're likely to encounter problems when scrolling because you change the ListView
items "from outside" (just test it with a large set of students). ListView
items should only be changed in getView()
and based on the current data for each position. So you should keep track of the expanded state of the rows in the Adapter, e.g. using a List<Boolean>
or better (for performance) a SparseBooleanArray
, and onClick()
change the corresponding data and call notifyDatasetChanged()
First, i really don't know the origin of that marginBottom... Sure must have been a design mistake. Second, thanks for the useful resource and for resolving my issue!
– davide m.
Nov 22 at 22:28
add a comment |
up vote
1
down vote
accepted
The execution works, but graphically it's not what I was expecting.
You set an attribute android:layout_marginBottom="368dp"
for the Button
, that's why the list item gets so huge.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap
This happens because the expanded item contains a (visible) Button
: if you leave out the Button
, then the item is "shrinkable". See for example this post on possible workarounds
Please note also that you're likely to encounter problems when scrolling because you change the ListView
items "from outside" (just test it with a large set of students). ListView
items should only be changed in getView()
and based on the current data for each position. So you should keep track of the expanded state of the rows in the Adapter, e.g. using a List<Boolean>
or better (for performance) a SparseBooleanArray
, and onClick()
change the corresponding data and call notifyDatasetChanged()
First, i really don't know the origin of that marginBottom... Sure must have been a design mistake. Second, thanks for the useful resource and for resolving my issue!
– davide m.
Nov 22 at 22:28
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
The execution works, but graphically it's not what I was expecting.
You set an attribute android:layout_marginBottom="368dp"
for the Button
, that's why the list item gets so huge.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap
This happens because the expanded item contains a (visible) Button
: if you leave out the Button
, then the item is "shrinkable". See for example this post on possible workarounds
Please note also that you're likely to encounter problems when scrolling because you change the ListView
items "from outside" (just test it with a large set of students). ListView
items should only be changed in getView()
and based on the current data for each position. So you should keep track of the expanded state of the rows in the Adapter, e.g. using a List<Boolean>
or better (for performance) a SparseBooleanArray
, and onClick()
change the corresponding data and call notifyDatasetChanged()
The execution works, but graphically it's not what I was expecting.
You set an attribute android:layout_marginBottom="368dp"
for the Button
, that's why the list item gets so huge.
Moreover, the item doesn't respond to other clicks anymore so I can't get them back "shrinked" with a second tap
This happens because the expanded item contains a (visible) Button
: if you leave out the Button
, then the item is "shrinkable". See for example this post on possible workarounds
Please note also that you're likely to encounter problems when scrolling because you change the ListView
items "from outside" (just test it with a large set of students). ListView
items should only be changed in getView()
and based on the current data for each position. So you should keep track of the expanded state of the rows in the Adapter, e.g. using a List<Boolean>
or better (for performance) a SparseBooleanArray
, and onClick()
change the corresponding data and call notifyDatasetChanged()
edited Nov 22 at 18:22
answered Nov 22 at 18:12
0X0nosugar
6,96631742
6,96631742
First, i really don't know the origin of that marginBottom... Sure must have been a design mistake. Second, thanks for the useful resource and for resolving my issue!
– davide m.
Nov 22 at 22:28
add a comment |
First, i really don't know the origin of that marginBottom... Sure must have been a design mistake. Second, thanks for the useful resource and for resolving my issue!
– davide m.
Nov 22 at 22:28
First, i really don't know the origin of that marginBottom... Sure must have been a design mistake. Second, thanks for the useful resource and for resolving my issue!
– davide m.
Nov 22 at 22:28
First, i really don't know the origin of that marginBottom... Sure must have been a design mistake. Second, thanks for the useful resource and for resolving my issue!
– davide m.
Nov 22 at 22:28
add a comment |
up vote
0
down vote
Change the root layout's height attribute from "match_parent" to "wrap_content"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"> ... </RelativeLayout>
add a comment |
up vote
0
down vote
Change the root layout's height attribute from "match_parent" to "wrap_content"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"> ... </RelativeLayout>
add a comment |
up vote
0
down vote
up vote
0
down vote
Change the root layout's height attribute from "match_parent" to "wrap_content"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"> ... </RelativeLayout>
Change the root layout's height attribute from "match_parent" to "wrap_content"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"> ... </RelativeLayout>
answered Nov 22 at 17:33
Nandakumar
12
12
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435522%2flistview-custom-items-graphically-incorrect%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown