簡體   English   中英

在ListView內的特定位置將文本設置為TextView

[英]Set text to TextView at a particular position inside a ListView

我正在使用帶有自定義適配器的ListView 每行中有兩個TextView 我只需要為單擊的textView更改這些TextView的文本。 我該如何實現?

我的CustomAdapter內部有一個方法,用於初始化TextView

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;
            }

        }
    }
}

現在,我需要根據用戶單擊的位置更改itemNameshowResult的文本。 itemName.setOnClickListener具有AsyncTask,我將在其中更改這些textViews的文本。 當前,它會更改為listView的最后一行。

如何更改所選位置的位置。

提前致謝。

重寫CustomAdapter的getView(...)函數,其中參數之一是int position。

不要忘記使用convertView,holder和settag / gettag進行平滑滾動並正確引用

更新:

在getView中放置:

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

另外,我們需要在postExecute()中引用convertView。 您可以在AsycTask參數中傳遞此引用,也可以為適配器設置getter setter,並在asyctask postexecute()中獲得單擊的引用。

首先使用您的兩個字符串和一個布爾值創建一個model(POJO)類,將其作為isChecked調用,然后將getter和setter添加到其中

將值(列表數據)設置為數組列表,並首次將setIsChecked值設置為false。 像這樣

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

等等

現在onItemClickListener用於這樣的循環

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

之后,現在進入適配器類,您可以在其中設置所需的textview,就像這樣

在getView方法中執行此操作

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

完成了,讓我知道它是否對您有幫助

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”):
                    }
                });

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM