Android Java: Unable to selectively highlight rows in a ListView via onScroll listener

泪湿孤枕 提交于 2019-12-13 03:05:36

问题


I have another blocker as I study Android Development. This time my problem is when I wanted to "selectively" highlight a row in a ListView populated by data from an adapter.

This ListView is actually within a dialog, and purpose is to show a list of friends, where user can multi-select and highlight it as he selects. The selected values by the way, is stored in an ArrayList "arr_FriendsShare" so that the next time he opens the listview, rows will be highlighted (via onScrollListener) for those previously selected.

What is currently happening, only the "recently" or "last" clicked row/item is highlighted; and seems to be clearing all the previously highlighted rows.

I cannot understand why it is behaving that way, as row's value is successfully stored to/removed from arr_FriendsShare ArrayList, as I click on it.

Below is my listener codes, and thanks in advance for the usual help:

    //Item click listener for Select Friends ListView
    listview_SelectFriends.setOnItemClickListener(new OnItemClickListener()
    {
       @Override
       public void onItemClick(AdapterView<?> adapter, View v, int position,
             long arg3) 
       {
             String friends_ListItemSelected = (String)adapter.getItemAtPosition(position); 

             if(!arr_FriendsShare.contains(friends_ListItemSelected)){
                 arr_FriendsShare.add(friends_ListItemSelected);
             }
             else{
                 removeItemFromArrayListString(Main.this, arr_FriendsShare, friends_ListItemSelected);
             }
       }
    });

    listview_SelectFriends.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
            for (int i = firstVisibleItem; i < (visibleItemCount + firstVisibleItem); i++) {
                String listViewItemText = view.getItemAtPosition(i).toString();
                if(arr_FriendsShare.contains(listViewItemText)){
                    ColorDrawable cd = new ColorDrawable(getResources().getColor(R.color.red_light));
                    view.setSelector(cd);
                }
                else if(arr_FriendsShare.contains(listViewItemText)){
                    ColorDrawable cd = new ColorDrawable(Color.TRANSPARENT);
                    view.setSelector(cd);
                }
            }
        }
    });

Additional Code Block:

    ArrayList<String> stringArray = new ArrayList<String>();
    String jsonURL = <SOME URL HERE>;
    stringArray = Global.getStringArrayFromJSON(Main.this, jsonURL, "friends", "FriendUsername");

    LayoutInflater inflater = getLayoutInflater();
    View convertView = (View) inflater.inflate(R.layout.friends_list_layout, null);

    ListView listview_SelectFriends = (ListView) convertView.findViewById(R.id.layout_Friends);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, stringArray);
    listview_SelectFriends.setAdapter(adapter);

回答1:


Change

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, stringArray);

to

// Define this at class level as --> private FriendsAdapter adapter = null;
adapter = new FriendsAdapter(Main.this, stringArray);

add this method in your activity

private void setResetSelection(int index, boolean setSelection){
    View v = listview_SelectFriends.getChildAt(index);
    if(v != null){
        TextView name = (TextView) v.findViewById(R.id.name);
        if(setSelection)
            name.setBackgroundResource(R.color.red);
        else
            name.setBackgroundResource(R.color.transparent);
    }
}

and create a new class as

public class FriendsAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private ArrayList<String> mFriends;
private ArrayList<String> mSelectedFriends = new ArrayList<String>();

public GoodPeopleAdapter(Context context, ArrayList<String> friends) {
    mInflater = LayoutInflater.from(context);
    mFriends= friends;
}

public void setSelectedFriends(ArrayList<String> selectedFriends){
    mSelectedFriends = selectedFriends;
}

@Override
public int getCount() {
    return mFriends.size();
}

@Override
public Object getItem(int position) {
    return mFriends.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder holder;
    if(convertView == null) {
        view = mInflater.inflate(R.layout.row_layout, parent, false);
        holder = new ViewHolder();
        holder.name = (TextView)view.findViewById(R.id.name);
        view.setTag(holder);
    } else {
        view = convertView;
        holder = (ViewHolder)view.getTag();
    }

    String name = mFriends.get(position);
    holder.name.setText(name);

    if(mSelectedFriends.contains(name))
        holder.name.setBackgroundResource(R.color.red) // red is in color xml by default, change according to your choice

    return view;
}

private class ViewHolder {
    public TextView name;
}
}

Add following line at the end of method onItemClick

adapter.setSelectedFriends(arr_FriendsShare);

Add this in the if part of onItemClick

setResetSelection(position, true);

and this in else part

setResetSelection(position, false);

Also create a new xml layout with name row_layout with a textview with id name.



来源:https://stackoverflow.com/questions/27725605/android-java-unable-to-selectively-highlight-rows-in-a-listview-via-onscroll-li

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!