Button disappears at runtime, visible in Eclipse design view - java

My app is for reading news from one site. The news parse from RSS feed and display as list of elements that include title and date. The main layout is ListView, and the layout post_entry for messages (news) looks like this:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:id="#+id/post_title">
</TextView>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="10sp"
android:paddingLeft="5dp"
android:paddingBottom="5dp"
android:id="#+id/post_pubDate">
</TextView>
</LinearLayout>
One TextView for the title, and another is for date.
Adapter for this view looks like this:
public class PostAdapter extends ArrayAdapter<PostItem> {
public ArrayList<PostItem> messages;
public LayoutInflater inflater;
public PostAdapter(Activity context, int resource,
ArrayList<PostItem> objects) {
super(context, resource, objects);
messages = objects;
inflater = LayoutInflater.from(context);
}
static class ViewHolder {
public TextView titleView;
public TextView pubDateView;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.post_entry, null, true);
holder = new ViewHolder();
holder.titleView = (TextView) convertView
.findViewById(R.id.post_title);
holder.pubDateView = (TextView) convertView
.findViewById(R.id.post_pubDate);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.titleView.setText(messages.get(position).title);
holder.pubDateView.setText(messages.get(position).date);
return convertView;
}
}
I want to add the button for refresh in the main activity.
After in the main activity looks like that:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="0.8" />
<Button
android:id="#+id/refresh"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:text="Refresh"
android:onClick="Update"/>
</LinearLayout>
In graphical mode in Eclipse I see the list of items and the button below it.
Everything seems ok, but when I run my app there is no button on the screen. I see just list of the news.
Do you know why can this be? And how to add the button below the list?

Related

Interacting with one element in Android ListView affects multiple

I have a list view of search items fetched from various web pages like so:
There is a horizontal scroll view on the titles so that users can fully see the title. However, when I scroll on one of the items, another item about 6 down from the item I was interacting with is also scrolled to the right. How can I prevent this from happening?
Update: Here's my CustomAdapter Code:
public class CustomAdapter extends ArrayAdapter<Item> implements View.OnClickListener{
private ArrayList<Item> dataSet;
Context mContext;
// View lookup cache
private static class ViewHolder {
TextView itemTitle;
TextView itemStore;
TextView itemPrice;
ImageView storeLogo;
}
public CustomAdapter(ArrayList<Item> data, Context context) {
super(context, R.layout.row_item, data);
this.dataSet = data;
this.mContext=context;
}
#Override
public void onClick(View v) {
int position=(Integer) v.getTag();
Object object= getItem(position);
Item item=(Item)object;
switch (v.getId())
{
case R.id.store:
Snackbar.make(v, "This item is being sold at " + item.getStore() + "." , Snackbar.LENGTH_LONG)
.setAction("No action", null).show();
break;
}
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
Item item = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.row_item, parent, false);
viewHolder.itemTitle = (TextView) convertView.findViewById(R.id.title);
//viewHolder.itemStore = (TextView) convertView.findViewById(R.id.type);
viewHolder.itemPrice = (TextView) convertView.findViewById(R.id.price);
viewHolder.storeLogo = (ImageView) convertView.findViewById(R.id.store);
result = convertView;
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
result = convertView;
}
viewHolder.itemTitle.setText(item.getTitle());
viewHolder.itemPrice.setText("$" + item.getPrice());
viewHolder.storeLogo.setOnClickListener(this);
viewHolder.storeLogo.setTag(position);
// Return the completed view to render on screen
return convertView;
}
}
Here is my fragment_search.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="#dimen/activity_vertical_margin"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"
tools:context="com.painlessshopping.mohamed.findit.Search$PlaceholderFragment">
<Button
android:text="Next Page"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/buttonUp"
android:onClick="buttonClicked"
android:elevation="0dp"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_marginStart="49dp" />
<Button
android:text="Previous Page"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/buttonDown"
android:onClick="buttonClicked"
android:elevation="0dp"
android:layout_marginStart="62dp"
android:layout_alignParentBottom="true"
android:layout_toEndOf="#+id/buttonUp" />
<EditText
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:ems="10"
android:id="#+id/editText"
android:layout_width="250dp"
android:hint="What can I help you find?"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
<ListView
android:layout_width="match_parent"
android:id ="#+id/listView"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_height="375dp" />
<Button
android:text="Search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/searchBtn"
android:layout_alignParentTop="true"
android:layout_toEndOf="#+id/editText" />
Here is my row_item.xml (For the custom adapter)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<HorizontalScrollView
android:id="#+id/horizontalScrollView"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_weight="1">
<TextView
android:id="#+id/title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:maxLines="1"
android:text="Sample Text for Android Horizontal Scroll View Goes Here"
android:textAppearance="#style/TextAppearance.AppCompat.Headline"
android:textStyle="bold"
android:textSize="18sp"
android:textColor="#color/dgrey"/>
</HorizontalScrollView>
<ImageView
android:id="#+id/store"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:src="#drawable/ic_favorite_border_black_24dp" />
</LinearLayout>
<TextView
android:id="#+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="#+id/horizontalScrollView"
android:text="$39.99"
android:textAppearance="#style/TextAppearance.AppCompat.Body1"
android:textSize="20sp"
android:textColor="#color/colorAccent"
android:textStyle="bold"
/>
</LinearLayout>
because of performance in constructor we check and see if we are able , we will use the previous layout that has generated, and just try to replace their values, but in your case because you can not change the scrol bar of view so your new item and previous items will have the same scroll bar view. i hope i were clear. so you have to always generate new layout like this:
#Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
Item item = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
final View result;
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.row_item, parent, false);
viewHolder.itemTitle = (TextView) convertView.findViewById(R.id.title);
//viewHolder.itemStore = (TextView) convertView.findViewById(R.id.type);
viewHolder.itemPrice = (TextView) convertView.findViewById(R.id.price);
viewHolder.storeLogo = (ImageView) convertView.findViewById(R.id.store);
result = convertView;
convertView.setTag(viewHolder);
viewHolder.itemTitle.setText(item.getTitle());
viewHolder.itemPrice.setText("$" + item.getPrice());
viewHolder.storeLogo.setOnClickListener(this);
viewHolder.storeLogo.setTag(position);
// Return the completed view to render on screen
return convertView;
}
also maybe there were a better way that i don't know, but this will solve your problem at least.
UPDATE :
for more information about how listview work and performance tip this link seem's good

Issue with ListView content (viewHolder is not altering views inside)

I've been looking for the answer to my problem, and I've found similar entries and have fixed some things but not the main problem.
When I run my code all thumbnails' images are the same and there is no text displaying in the TextViews, even though the Log.D is showing I'm changing the textViews to the correct texts and images.
My activity code:
ListView lvMaterias;
String[] materiasNombre;
int[] thumbnails={R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui,
R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui,
R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui,
R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui,
R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui,
R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui,
R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui,
R.drawable.thumbnailanato,
R.drawable.thumbnailbioqui};
List<materiaRow> materiasObjetos= new ArrayList<materiaRow>();
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select);
//inicializar los arrays y todo
lvMaterias = (ListView)findViewById(R.id.lvMaterias);
materiasNombre=this.getResources().getStringArray(R.array.nombreMateria);
int i=0;
for (String nombre : materiasNombre){
Log.d("loop", nombre);
materiasObjetos.add(new materiaRow(thumbnails[i],nombre, "0%"));
}
lvMaterias.setAdapter(new materiasAdapter(getApplicationContext(), R.layout.rowmateria, materiasObjetos));
}
}
My Adapter Class, the log.d at the getView method show I have the correct text and images, but textViews are not getting changes:
public class materiasAdapter extends ArrayAdapter implements View.OnClickListener{
private int layout;
public materiasAdapter(Context context, int resource, List objects) {
super(context, resource, objects);
layout=resource;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
materiaHolder mH;
if (convertView==null){
mH= new materiaHolder();
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView= inflater.inflate(layout, parent, false);
mH.thumbnail= (ImageView) convertView.findViewById(R.id.ivthumbnail);
mH.materia= (TextView) convertView.findViewById(R.id.tvmateria);
mH.porcentaje= (TextView) convertView.findViewById(R.id.tvporcentaje);
mH.favorito = (Button) convertView.findViewById(R.id.bfavoritos);
mH.favorito.setOnClickListener(this);
convertView.setTag(mH);
}
else {
mH= (materiaHolder) convertView.getTag();
}
materiaRow mR= (materiaRow) getItem(position);
mH.thumbnail.setImageResource(mR.getThumbnail());
mH.porcentaje.setText(mR.getPorcentaje());
Log.d("thumbnail", Integer.toString(mR.getThumbnail()));
mH.materia.setText(mR.getMateria());
Log.d("texto", mR.getMateria());
return convertView;
}
#Override
public void onClick(View v) {
}
class materiaHolder {
ImageView thumbnail;
TextView materia;
TextView porcentaje;
Button favorito;
}
}
XML as requested (Select Activity):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.quetzal.elite.Select">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"></LinearLayout>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="#+id/lvMaterias" />
And rowMateria (resource of the adapter class):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:id="#+id/ivthumbnail" />
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dp" >
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="#+id/tvmateria" />
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="#+id/tvporcentaje" />
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="fav"
android:id="#+id/bfavoritos" />
</LinearLayout>
Thanks in advance for the help.
As far as the issue with the thumgnail goes... In your main onCreate(), it doesn't look like you aren't adding the rows correctly.
int i=0;
for (String nombre : materiasNombre){
Log.d("loop", nombre);
materiasObjetos.add(new materiaRow(thumbnails[i],nombre, "0%"));
}
You need to increment i, or you will always get thumbnails[0].
When I ran your code, for whatever reason on my emulator, the text color and background color were the same - So the text was being set, but you could not see it.
You can set up your background on the activity as something specific like
android:background="#android:drawable/screen_background_dark"
and the text with something like
android:textColor="#android:color/primary_text_light"
I'm not very well versed on the preferred methods of setting the background and text colors - longer term you should be looking at the themes I believe.
Try making the ViewHolder class static like here:
https://github.com/isaacurbina/ViewHolderListView/blob/master/app/src/main/java/com/mac/isaac/viewholderlistview/MyArrayAdapter.java
Hope it helps!

Android - ListView with ArrayAdapter and hidden TextViews

I have a problem with the ArrayAdapter in the ListView in my Android application. The TextViews that should be displayed have two possibilites, with an info text or without an info text. The problem appears while scrolling. When I scroll down and up again the TextViews that didn't had an info text now have a random info text (from one of the TextViews with info text). The problem appears because of the memory usage of the ListView. Now I am looking for a possibility to solve the problem. The result should show the TextViews (without the info text) after scrolling without the info text. So is there any good solution with using the ArrayAdapter in a ListView or is there any other Android widget to use?
Java Code (Activity class):
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
View view = convertView;
if (view == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(layout, null);
holder.text = (TextView) view.findViewById(R.id.list_layout_textview);
holder.infoText = (TextView) view.findViewById(R.id.list_layout_infos);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
final OutputTweet outputTweet = tweetObjects.get(position);
if (outputTweet.getText() != null) {
holder.text.setText(outputTweet.getText());
}
if (!outputTweet.getInfoText().equals("")) {
holder.infoText.setVisibility(View.VISIBLE);
holder.infoText.setText(outputTweet.getInfoText());
}
return view;
}
}
Layout XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/list_layout"
>
<TextView
android:id="#+id/list_layout_infos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#color/text_info_color"
android:layout_marginTop="2dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:textSize="12sp"
android:textStyle="italic"
android:visibility="gone"
/>
<TextView
android:id="#+id/list_layout_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#color/textColor"
android:layout_marginTop="2dp"
android:layout_marginBottom="3dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:fontFamily="sans-serif-light"
android:typeface="sans"
android:textSize="15sp"
/>
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#android:color/darker_gray"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"/>
</LinearLayout>
Thank you for every solution :)
You need to add an else clause to your last if clause that sets the view back to View.GONE or View.INVISIBLE. The view is being recycled, and since it was being shown before, it will still be visible when it is passed back to you.
In general when binding you need to bind ALL state, including visibility changes. Don't assume any state from the inflation because of the reuse of views.
Try this:
if (outputTweet.getText() != null) {
holder.text.setText(outputTweet.getText());
} else {
holder.text.setText("");
}
if (!outputTweet.getInfoText().equals("")) {
holder.infoText.setVisibility(View.VISIBLE);
holder.infoText.setText(outputTweet.getInfoText());
} else {
holder.infoText.setVisibility(View.GONE);
}

error: NullPointerException

I'm trying to set an Adapter this way to display a ListView:
public class DrugAdapter extends ArrayAdapter {
Context context;
Resources resources;
private List<DrugModel> drug;
private LayoutInflater myInflater;
public DrugAdapter(Context context, ArrayList<DrugModel> listOfDrugs) {
super(context, R.layout.activity_main, listOfDrugs);
this.context = context;
this.drug = listOfDrugs;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
resources = context.getResources();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.activity_main, parent, false);
TextView name = (TextView) convertView.findViewById(R.id.list_item_name);
TextView description = (TextView) convertView.findViewById(R.id.list_item_description);
name.setText(drug.get(position).getName()); // HERE IS WHERE THE ERROR MESSAGE OCCURS
Typeface tf = Typeface.createFromAsset(context.getAssets(), "arial.ttf");
name.setTypeface(tf);
description.setText(drug.get(position).getDescription());
return convertView;
}
}
But I'm getting this error message:
FATAL EXCEPTION: main
java.lang.NullPointerException
at com.mypharmacy.adapters.DrugAdapter.getView(DrugAdapter.java:47)
at android.widget.AbsListView.obtainView(AbsListView.java:2465)
at android.widget.ListView.makeAndAddView(ListView.java:1775)
at android.widget.ListView.fillDown(ListView.java:678)
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"
android:paddingBottom="#dimen/activity_vertical_margin"
tools:context="com.mypharmacy.app.MainActivity">
<EditText
android:id="#+id/search_drugs_edittext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="#string/search_for_a_drug"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true">
<requestFocus/>
</EditText>
<ListView
android:id="#+id/list_of_drugs"
android:layout_below="#id/search_drugs_edittext"
android:layout_width="fill_parent"
android:layout_height="425dp"
android:minHeight="?android:attr/listPreferredItemHeight" />
</RelativeLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:minHeight="70dp" >
<TextView
android:id="#+id/list_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name: init value"
android:textColor="#008019"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:id="#+id/list_item_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="description: init value"
android:textColor="#0080A9"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_below="#+id/list_item_name"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="54dp"
android:layout_marginTop="50dp" />
</RelativeLayout>
With which I couldn't be able to figure out what's wrong. How to fix this, please ? Why does the name variable takes the value of Null ?
I think that your problem is in this line.
convertView = inflater.inflate(R.layout.activity_main, parent, false);
You are probably inflating the wrong layout, if that is the case, even if you call this line:
convertView.findViewById(R.id.list_item_name);
and R.id.list_item_name is valid, that id is not in that layout. If you call to findViewById having inflated a different layout, you will receive a null item.
Hope it helps
Your activity_main.xml does not have a TextView with id list_item_name. The TextView name is null.
Change this
convertView = inflater.inflate(R.layout.activity_main, parent, false);
to
convertView = inflater.inflate(R.layout.list_item, parent, false);
Also consider using a ViewHolder pattern
http://developer.android.com/training/improving-layouts/smooth-scrolling.html

Android listview array adapter selected

i'm trying to add a contextual action mode to a listview, but i'm having some problems with the selection, if i make aList1.setSelection(position) it doesn't select anything, and if i make List1.setItemChecked(position, true) it works but it only changes the font color a little and i want it to change the background or something more notable, is there any way to detect the selection and manually and change the background, or i'm missing something?
the list:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="#+id/list1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:drawSelectorOnTop="false">
</ListView>
</RelativeLayout>
the adapter:
public class ServicesRowAdapter extends ArrayAdapter<String[]> {
private final Activity context;
private final ArrayList<String[]> names;
static class ViewHolder {
public TextView Id;
public TextView Date;
public RelativeLayout statusbar,bglayout;
}
public ServicesRowAdapter(Activity context, ArrayList<String[]> names) {
super(context, R.layout.servicesrowlayout, names);
this.context = context;
this.names = names;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.servicesrowlayout, null);
ViewHolder viewHolder = new ViewHolder();
viewHolder.Id = (TextView) rowView.findViewById(R.id.idlabel);
viewHolder.Date = (TextView) rowView.findViewById(R.id.datelabel);
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
holder.Date.setText(names.get(position)[2]);
holder.Id.setText(names.get(position)[1]);
return rowView;
}
}
with the use of a layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="#+id/idlabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:gravity="right"
android:text="#+id/idlabel"
android:textSize="20dp"
android:width="70dp" >
</TextView>
<TextView
android:id="#+id/datelabel"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#+id/datelabel"
android:textSize="20dp"
android:layout_marginLeft="90dp" >
</TextView>
</RelativeLayout
This is becasue in touch mode there is no focused or selection. You're on the right track using the checked state. You just need to use a state drawable with different states.
Steps:
1) In your row_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#drawable/item_selector"
>
2) Create a new xml file (match the name to the one you used in your row layout) in your drawable folder like so (note that I have a color.xml file set up so I can use #color/color, if you don't you can simply put a hex color code in there):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_activated="true"
android:drawable="#color/blue" />
</selector>
That's it. It's not reaql intuitive, but "activated" basically means "checked" when you have enabled the checked state.
With that setup (and enabling the list rows to be checkable) you will now have the background changed from whatever it is normally to blue when in the checked state. Add code to set that state in onTouch or onClick and you'll be all set. The background will stay that way until you touch another item.

Categories

Resources