在 BaseAdapter 中动态增加单击时的文本计数

Dynamically Increase the text count on click in BaseAdapter

我在 Layout 中有 Like Button 并设置了文本 "like 0" ,我在 Base Adapter 中设置了,当我点击 Like Buttton 时,文本会增加而不刷新整个 Activity Like in facebook 应用程序,我卡住了三天,我已经阅读并实现了 Whosebug 的几乎所有答案,但没有得到解决方案。我希望我能得到答案。这是我的基本适配器 <-------->

public class FeedAdaptorView   extends BaseAdapter{

  ArrayList<HashMap<String, String>> data;

        HashMap<String, String> resultp = new HashMap<String, String>();
        String UserID;
     public FeedAdaptorView(Context context,
                ArrayList<HashMap<String, String>> arraylist, String uSERid2) {
            this.context = context;
            data = arraylist;

        }
        public class ViewHolder {
            TextView name,time,status,likecount;
            ImageView userimage,postimage;
            Button like,comment,share;

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

        @Override
        public Object getItem(int position) {
            return null;
        }

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

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


              if(convertView==null){
                  LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                  convertView = inflater.inflate(R.layout.feed_item, null);
                  holder=new ViewHolder();
                  pos=getItemViewType(position);
                  holder.name = (TextView) convertView.findViewById(R.id.name);

                  holder.status=(TextView)convertView.findViewById(R.id.txtStatusMsg);
                  holder.userimage=(ImageView)convertView.findViewById(R.id.profilePic);
                  holder.postimage=(ImageView)convertView.findViewById(R.id.feedImage1);
                  holder.like=(Button)convertView.findViewById(R.id.like);
                  holder.comment=(Button)convertView.findViewById(R.id.comment);
                  holder.pos=position;

                  convertView.setTag(holder);
              }
              else {
                holder = (ViewHolder) convertView.getTag();
            }
              holder.like.setTag(pos);
         /*   inflater = (LayoutInflater) context
            holder.comment.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                  ((ListView) parent).performItemClick(v, position, 0);
            }
        });         .getSystemService(Context.LAYOUT_INFLATER_SERVICE);*/

       holder.comment.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                  ((ListView) parent).performItemClick(v, position, 0);
            }
        });
       holder.postimage.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                  ((ListView) parent).performItemClick(v, position, 0);
            }
        });
       holder.like.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                    Toast.makeText(context, "You Liked The Post", Toast.LENGTH_SHORT).show();

           holder.like.setText("Like"+"4");

           notifyDataSetChanged();
    // here i am calling the web services for like button update
   new likepost().execute();

            }
        }); 

<-------------------------------->

webservice callin method
class likepost extends AsyncTask<Void, Void, Void> 
        {
            int flag=0;
         @Override
         protected void onPreExecute()
         {
          super.onPreExecute();
          // Create a progressdialog
          mProgressDialog = new ProgressDialog(context);
          // Set progressdialog message
          mProgressDialog.setMessage("Loading...");
          mProgressDialog.setIndeterminate(false);
          mProgressDialog.setCancelable(false);
          // Show progressdialog
          mProgressDialog.show();
         }

         @Override
         protected Void doInBackground(Void... args0) {
          List<NameValuePair> params = new ArrayList<NameValuePair>();


                   String Status="1";
          String ID=feedid;

          params.add(new BasicNameValuePair("UserID",UserID));
          params.add(new BasicNameValuePair("FeedId",ID));
          params.add(new BasicNameValuePair("like_status",Status));

          JSONObject json = jsonParser.makeHttpRequest(AppControllerClass.FeedLike,"POST", params);
          Log.d("Create Response", json.toString());

          try{
           if(json!=null)
           {
             String status=json.getString("status");
             if(status.equals("Success"))
             {
              flag=1;
             // Toast.makeText(context, "You Liked The Post", Toast.LENGTH_SHORT).show();
             }
             else
             {
             flag=2;
             //Toast.makeText(context, "Check The Connection", Toast.LENGTH_SHORT).show(); 
             }
           }
           else{
            flag=2;
           }

          }
          catch (JSONException e) {
           e.printStackTrace();
          }


          return null;
         }
         @Override
         protected void onPostExecute(Void args) 
         {
          mProgressDialog.dismiss();
          if(flag==1)
          {
           Toast.makeText(context, "You Liked The Post", Toast.LENGTH_SHORT).show();

          }
          else if (flag==2) 
          {
           Toast.makeText(context, "Check The Connection", Toast.LENGTH_SHORT).show(); 
          } 



         }

Dynamically Increase the text count on click in BaseAdapter

使用 getTag/setTag:

@Override
 public void onClick(View c) {
    int count=0; 
    if(v.getTag()==null)
        count=0;
    else{
      count=Integer.parseInt(v.getTag().toString());
    }
    count++;
    ((TextView)v).setText("Like"+count);
    v.setTag(count);
 }

试试这个..

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

而不是

@Override
    public Object getItem(int position) {
        return null;
    }

第一次在Whosebug上回答问题,希望我的回答能够帮助到您解决问题。

问题:

 holder.like.setText("Like"+"4");

 notifyDataSetChanged();

问题就在这里。您已将其手动设置为 setText("Like"+"4")。在BaseAdapter的notifyDataSetChanged()函数中,引用了一个ADAPTER信息。

在您的情况下,它将是 resulttp 的引用。它引用您传入的数据 ArrayList。当您调用 notifyDataSetChanged() 时,它将返回 resulttp 并显示 ArrayList 中的内容。

解决方案:

1) 删除此行

holder.like.setText("Like"+"4");

2) 在您的 BaseAdapter 中添加一个名为 update() 的新函数 class

public void updateAdapter(ArrayList<HashMap<String, String>> newData)
{

     this.data.clear();
     this.data = data;
     notifyDataSetChanged();
}

3) 在您的点赞按钮/图片 onClickListener 上,调用函数 updateAdapter() 并传入更新的 ArrayList。

应该已经好了。祝你好运!