【问题标题】:Getting Text from Textview in Listview inflated Layout从 Listview 膨胀布局中的 Textview 获取文本
【发布时间】:2014-08-21 20:50:09
【问题描述】:

我有一个列表视图,在其中我使用多个文本视图和按钮来扩展布局。我知道从被点击的视图中获取文本是((Textview)view...。但是,我试图从位于用户单击的布局中的特定文本视图中获取文本。我尝试过使用 OnItemClick,但是当我使用它时,必须在任何按钮功能起作用之前将项目聚焦。我求助于并更喜欢在我的自定义适配器的getView 方法中使用 onClickListeners。简而言之,鉴于每个膨胀布局都被视为一个列表项,我如何单击 Button 并获取位于适当膨胀布局列表视图项中的 TextView 中的文本?

更新

这里有图片来说明我在寻找什么。两种布局都是列表视图的成员。

我想单击带有日期的按钮,然后从布局中间的文本视图中获取文本。但是,当我单击带有日期的按钮时,我只能从最后一个孩子布局中间的文本视图中获取文本。如果“我的派对”是列表视图中的第一个孩子,而“3303 离开服务...”是第二个孩子,那么当我单击日期按钮时,我的自定义适配器中的代码会从视图中最后加载的文本中返回文本这将是“3303 离开服务”。我想要做的是当我点击“我的派对”上的日期按钮时,得到文本“我的派对”。和第二个孩子一样聪明。

这是我的自定义适配器中的 getView()。

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        viewHolder = new ViewHolder();

        positionHolder = position;
        Log.i("Position", "" + position);

        if(convertView == null) {

            try {

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.post_layout, parent, false);
                postLayout = convertView;

                viewHolder.unameTV = (TextView) postLayout.findViewById(R.id.postUnameTv);
                viewHolder.unameTV.setText(viewContent.get(index));
                viewHolder.unameTV.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        // Starting new intent
                        Intent in = new Intent(getActivity(),
                                Profile.class);
                        // sending pid to next activity
                        String username =((TextView)view).getText().toString();
                        in.putExtra("username", username);

                        // starting new activity and expecting some response back
                        startActivityForResult(in, 100);
                    }
                });

                viewHolder.fillSpace = (TextView)postLayout.findViewById(R.id.posthelpSpace);
                viewHolder.fillSpace.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        viewHolder.unameTV.performClick();
                    }
                });




                viewHolder.image = (ImageView) postLayout.findViewById(R.id.postProfPic);
                DisplayImageOptions options = initiateDisplayImageOptions();
                viewHolder.image.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        viewHolder.unameTV.performClick();
                    }
                });

                ImageLoader imageloader = ImageLoader.getInstance();

                initImageLoader(getActivity());
                imageloader.displayImage(viewContent.get(index + 1), viewHolder.image, options);




                viewHolder.addToCalendarButton = (TextView) postLayout.findViewById(R.id.addToCalendarButton);
                viewHolder.addToCalendarButton.setText(viewContent.get(index + 2));
                viewHolder.addToCalendarButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Calendar cal = new GregorianCalendar();
                        cal.setTime(new Date());
                        cal.add(Calendar.MONTH, 2);
                        long time = cal.getTime().getTime();

                        Uri.Builder builder =
                                CalendarContract.CONTENT_URI.buildUpon();
                        builder.appendPath("time");
                        builder.appendPath(Long.toString(time));
                        Intent intent =
                                new Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI);

                        title = testText.getText().toString();
                        Log.i("Title", "" + title);
                        intent.putExtra("title", title); // **NOT WORKING**
                        startActivity(intent);
                    }
                });



                viewHolder.eventTitle = (TextView) postLayout.findViewById(R.id.postTitleTV);
                viewHolder.eventTitle.setText(viewContent.get(index + 3));
                viewHolder.eventTitle.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        title = ((TextView)view).getText().toString();
                        Log.i("TITLE", "" + title);

                    }
                });

                testText = viewHolder.eventTitle;
                viewHolder.eventImage = (ImageView) postLayout.findViewById(R.id.eventImage);
                imageloader.displayImage(viewContent.get(index + 4), viewHolder.eventImage, options);


                viewHolder.likesTV = (TextView) postLayout.findViewById(R.id.likesTV);
                viewHolder.likesTV.setText("" + viewContent.get(index + 5));

                viewHolder.planToAttendTV = (TextView) postLayout.findViewById(R.id.planToAttendTV);
                viewHolder.planToAttendTV.setText(viewContent.get(index + 6));

                viewHolder.addressTV = (TextView) postLayout.findViewById(R.id.postLocationTV);
                viewHolder.addressTV.setText("" + viewContent.get(index + 7));


                index = index + 8;


            }
            catch (IndexOutOfBoundsException ie)
            {
                ie.printStackTrace();
            }
        }
        else
        {
            viewHolder = (ViewHolder) postLayout.getTag();
        }




        return postLayout;
    }

【问题讨论】:

  • 发布一些代码适配器和主代码
  • @Rod_Algonquin 您希望我具体发布什么?仅与我的问题有关,还是您暗示它可能在其他地方?我的 main 包含很多代码,所以这就是我要问的原因。

标签: android listview


【解决方案1】:

创建一个自定义 baseadapter 并设置适配器中文本视图的单击侦听器。这将为与位置对应的特定文本视图设置。

【讨论】:

    【解决方案2】:

    我认为您已经在要注册点击的 textview 的自定义 BaseAdapter setOnclicklistener 中创建了自定义 BaseAdapter。

    下面的示例代码

    public class M_Adapter extends BaseAdapter {
        private LayoutInflater inflater = null;
        private TextView contact_name;
        private Context context;
        private List<String> list;
        private List<String> temp;
        private Button btn;
    
        public M_Adapter(Context context) {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            try {
                list = new ArrayList<String>();
                //add some values in list here
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public int getCount() {
            return list.size();
        }
    
        @Override
        public Object getItem(int position) {
            return position;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, final View convertView, ViewGroup parent) {
            final View rowview = inflater.inflate(R.layout.contact_listrow, parent, false);
            contact_name = (TextView) rowview.findViewById(R.id.excl_ppl_contact_name);
            btn=(Button)rowview.findViewById(R.id.excl_ppl_btn);
            contact_name.setText(list.get(temp));
    
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                Log.v("myapp", "text clicked " + contact_name.getText());
                }
            });
            return rowview;
        }
    
    }
    

    【讨论】:

    • 这不是我想要达到的目标我已经更新了问题
    • 这将只返回最后加载到 textview 的字符串的文本,而不是该 textview 中的行特定文本。
    • 不理解你的问题..你需要更清楚。
    【解决方案3】:

    我用两个系列的 if/else 语句解决了这个问题。首先,在我的 onBindViewHolder(你的 getView)中,我有一些全局字符串变量采用我感兴趣的 TextView 的值。其次,在 onClick 方法中,我让 ViewHolder 告诉我使用 getPosition 点击​​的项目的位置方法。最后,我将点击位置的值与第一部分中创建的字符串变量相匹配,然后从那里继续。

    public void onBindViewHolder(final ViewHolder holder, final int position) {
            YelpAPI.businessNumber = position;
            YelpAPI.queryAPI(YelpAPI.yelpApi, YelpAPI.yelpApiCli);
    
        Picasso.with(mContext).load(YelpAPI.picture).into(holder.yelpPicture);
        holder.textName.setText(YelpAPI.name);
        holder.textRating.setText(YelpAPI.rating);
        holder.textReviews.setText(YelpAPI.reviews);
        holder.textAddressDetails.setText(YelpAPI.fullAddress);
        holder.textInfo.setText(YelpAPI.moreInfo);
        holder.textID.setText(YelpAPI.businessID);
    

    ---------首先...

        if(position == 0){
            firstBusiness = YelpAPI.businessID; //these three String variables get created above
        } else if(position == 1){
            secondBusiness = YelpAPI.businessID;
        } else if (position == 2) {
            thirdBusiness = YelpAPI.businessID;
        }
    
        holder.business.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    

    ---------第二...

                int specific = holder.getPosition();
    

    ---------最后...

                String saveMe = "";
                if(specific == 0){
                    saveMe = firstBusiness;
                } else if(specific == 1){
                    saveMe = secondBusiness;
                } else if(specific == 2){
                    saveMe = thirdBusiness;
                }
                Log.d("Clicked this item: ", String.valueOf(specific));`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      相关资源
      最近更新 更多