Set text to TextView at a particular position inside a ListView

做~自己de王妃 提交于 2019-12-11 09:44:40

问题


I am using a ListView with a custom Adapter. I have two TextView inside each row. I need to change the text of these TextView only for the textViews which I click. How can I achieve it?

I have a method inside my CustomAdapter where I initialise the TextView's

public class MainListAdapter extends BaseAdapter {

    private static final String TAG = "MainListAdapter";

    private Context mContext;

    private LayoutInflater layoutInflater;

    private MyViewPager itemViewPager;

    private View viewMain;

    private View viewSlide;

    private TextView cancel;

    private TextView delete, block;

    TextView itemName, showResult;

    int triedOnce;

    private ArrayList<View> views;

    private PagerAdapter pagerAdapter;

    private ArrayList<String> mList;

    public static final String API_KEY = "MYAPIKEY";

    public MainListAdapter(Context context, ArrayList<String> list) {
        mContext = context;

        layoutInflater = LayoutInflater.from(mContext);
        mList = list;
    }

    @Override
    public int getCount() {
        return mList != null ? mList.size() : 0;
    }

    @Override
    public Object getItem(int position) {
        return mList != null ? mList.get(position) : null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.listview_item, null);
        }

        if(position%2 == 0){
            convertView.setBackgroundResource(R.drawable.lis_bg);
        }else if(position%2 == 1){
            convertView.setBackgroundResource(R.drawable.ls_eppadi_bg);
        }

        viewMain = layoutInflater.inflate(R.layout.listview_item_main, null);
        viewSlide = layoutInflater.inflate(R.layout.listview_item_slide, null);

        cancel = (TextView)viewSlide.findViewById(R.id.tv_menu_cancel);
        delete = (TextView)viewSlide.findViewById(R.id.tv_menu_delete);
        block = (TextView) viewSlide.findViewById(R.id.tv_menu_block);

        cancel.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    //perform cancel
                }
            });

        delete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    //perform delete
                }
            });

        block.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //perform block
                }
            });

        views = new ArrayList<View>();
        views.add(viewMain);
        views.add(viewSlide);

        itemViewPager = (MyViewPager)convertView.findViewById(R.id.vp_list_item);
        itemViewPager.setSelfIndex(position);
        pagerAdapter = new PagerAdapter() {

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                ((MyViewPager)container).removeView(views.get(position));
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                ((MyViewPager)container).addView(views.get(position));
                return views.get(position);
            }

            @Override
            public boolean isViewFromObject(View arg0, Object arg1) {
                return arg0 == arg1;
            }

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

        fillItemData(convertView, position, viewMain);
        itemViewPager.setAdapter(pagerAdapter);
        itemViewPager.setCurrentItem(0);
        return convertView;
    }


    //this is where the textview's are initialised
    private void fillItemData(View convertView, final int position, View viewMain) {
        int[] colorCollection = {
            R.color.green, R.color.royalblue, R.color.violet
        };

        for (int i = 0; i < colorCollection.length; i++) {
            colorCollection[i] = mContext.getResources().getColor(colorCollection[i]);
        }

        int currColor = colorCollection[position % colorCollection.length];

        itemName = (TextView)viewMain.findViewById(R.id.tv_item_name);
        showResult = (TextView)viewMain.findViewById(R.id.tv_show);

        itemName.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {

                    new PushTask().execute(position);
                    triedOnce = 0;

                }
        });

        itemName.setBackgroundColor(currColor);
        showResult.setBackgroundColor(currColor);

        itemName.setText(mList.get(position));
    }

    class PushTask extends AsyncTask<Integer, Integer, Integer> {


        @Override
        protected void onPreExecute() {
            itemName.setVisibility(View.GONE);
            showResult.setVisibility(View.VISIBLE);
            //set text here based on the position
            showResult.setText("SENDING");
        }

        @Override
        protected Integer doInBackground(Integer... position) {
            int post = position[0];
            int respCode = 0;

            //perform my network operations

            return respCode;
        }

        @Override
        protected void onPostExecute(Integer response) {
            switch(response) {
                case 1:
                    //set text here
                    showResult.setText("SENT");
                    Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                            showResult.setVisibility(View.GONE);
                            itemName.setVisibility(View.VISIBLE);
                            }
                            }, 2000);
                    break;
                case 2:
                    //set text here
                    showResult.setText("PLEASE WAIT!");
                    handler = new Handler();
                    handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                            showResult.setVisibility(View.GONE);
                            itemName.setVisibility(View.VISIBLE);
                            }
                            }, 2000);
                    break;
                case 3:
                    //set text here
                    showResult.setText("FAILED!");
                    handler = new Handler();
                    handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                            showResult.setVisibility(View.GONE);
                            itemName.setVisibility(View.VISIBLE);
                            }
                            }, 2000);
                    break;
                case 4:
                    //set text here
                    showResult.setText("FAILED!");
                    handler = new Handler();
                    handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                            showResult.setVisibility(View.GONE);
                            itemName.setVisibility(View.VISIBLE);
                            }
                            }, 2000);
                    break;
                default:
                    break;
            }

        }
    }
}

Now I need to change the itemName and showResult's text based on the position where the user clicks. The itemName.setOnClickListener has the AsyncTask where I will changing the text of these textViews. Currently it changes for the last row of the listView.

How do I change it for the position selected.

Thanks in advance.


回答1:


Override the getView(...) function of CustomAdapter,where one of the arguments is int position .

Don't forget to use convertView, holder and settag/gettag for smooth scrolling and correct references

Update:

in getView put:

convertView.setOnClickListener(new OnClickListener() {
        @Override 
        public void onClick(View v) {
           //perform update on textView here
        } 
    }); 

Also we need reference of convertView in postExecute(). You can pass this reference in AsycTask arguments or set getter setter for the adapter and get clicked reference in asyctask postexecute()




回答2:


create a model(POJO) class first with your two strings and one boolean value call it as isChecked add getters and setters to it

set values(list data) to your arraylist and keep setIsChecked value to false for the first time. like this

ArrayList<model> list = new ArrayList<model>();
list.add(new model("string1","string2",false);
list.add(new model("string11","string22",false);

and so on

now onItemClickListener use for loop like this

for(int i = 0 ; i < list.size; i++){
list.get(i).setIsChecked(false);
}
list.get(itemClickedPosition).setIsChecked(true);
youradapter.notifyDataSetChanged();

after that now come to the adapter class where you can set the selected textview as you want do like this

in getView method do this

if(list.get(position).getIsChecked()){
change your textview
}else{
leave as it is
}

done let me know if it helps you




回答3:


Pass View in Async Task and then convert into textView and SetText  in DoInBackground Method.

   new PushTask().execute(v);


    @Override
        protected Integer doInBackground(final View position) {
     runOnUiThread(new Runnable() {
                    public void run() {
                        // some code #3 (Write your code here to run in UI thread)
 TextView txtName=(TextView)position;
       txtname.setText(“android”):
                    }
                });

    }


来源:https://stackoverflow.com/questions/31340985/set-text-to-textview-at-a-particular-position-inside-a-listview

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