2016-01-12 74 views
0

我有一个与Textview,ImageView和Button的列表视图,我想要的是改变按钮的背景,当它点击时,我希望你能说出我的问题。如何在列表视图中获取按钮的位置?

这是适配器。

package com.example.mahdi.chat; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.support.v4.app.Fragment; 
import android.text.Html; 
import android.text.TextUtils; 
import android.text.format.DateUtils; 
import android.text.method.LinkMovementMethod; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.VolleyLog; 
import com.android.volley.toolbox.ImageLoader; 
import com.android.volley.toolbox.NetworkImageView; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 
import org.w3c.dom.Text; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import circleview.CircleImageView; 

public class FeedListAdapter extends BaseAdapter { 

private static final String TAG = FeedListAdapter.class.getSimpleName(); 

private Activity activity; 
private LayoutInflater inflater; 
private List<FeedItem> feedItems; 
JSONParser jsonParser = new JSONParser(); 
private String URL = "http://10.0.3.2/social/like.php"; 
private String user_id; 
private Button like,comment; 

private static final String TAG_SUCCESS = "success"; 
FeedItem item; 
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 

public FeedListAdapter(Activity activity, List<FeedItem> feedItems, String user_id) { 
    this.activity = activity; 
    this.feedItems = feedItems; 
    this.user_id = user_id; 
} 

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

@Override 
public Object getItem(int location) { 
    return feedItems.get(location); 
} 

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

public void refresh(List<FeedItem> newlist) { 
    feedItems.addAll(newlist); 
    this.notifyDataSetChanged(); 
} 
public List<FeedItem> getData() { 
    return feedItems; 
} 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (inflater == null) 
     inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) 
     convertView = inflater.inflate(R.layout.posts_row, null); 

    if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 

    final TextView name = (TextView) convertView.findViewById(R.id.name); 
    TextView timestamp = (TextView) convertView 
      .findViewById(R.id.time); 
    TextView statusMsg = (TextView) convertView 
      .findViewById(R.id.status); 
    TextView url = (TextView) convertView.findViewById(R.id.url); 
    CircleImageView profilePic = (CircleImageView) convertView 
      .findViewById(R.id.profile_img); 
    FeedImageView feedImageView = (FeedImageView) convertView 
      .findViewById(R.id.image); 


    TextView nbr_likes = (TextView)convertView.findViewById(R.id.nbr_likes); 
    TextView nbr_comments = (TextView)convertView.findViewById(R.id.nbr_comments); 


    item = feedItems.get(position); 




    like =(Button)convertView.findViewById(R.id.like); 
    comment =(Button)convertView.findViewById(R.id.comment); 




    like.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 

      item = feedItems.get(position); 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("post_id", item.getId()); 
      params.put("user_id", user_id); 
      Toast.makeText(activity, item.getId(), Toast.LENGTH_SHORT).show(); 
      Toast.makeText(activity, user_id, Toast.LENGTH_SHORT).show(); 
      // making fresh volley request and getting json 
      CustomRequest jsonReq = new CustomRequest(Request.Method.POST, 
        URL,params , new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        VolleyLog.d(TAG, "Response: " + response.toString()); 
        if (response != null) { 

         parseJsonFeed(response); 


        } 
       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       } 
      }); 

      // Adding request to volley request queue 
      AppController.getInstance().addToRequestQueue(jsonReq); 



     } 

    }); 



    comment.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 



     } 


    }); 

    name.setText(item.getName()); 

    nbr_likes.setText(item.getNbrLikes()+ " Likes"); 
    nbr_comments.setText(item.getNbrComments() + " Comments"); 


    // Converting timestamp into x ago format 
    CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
      Long.parseLong(item.getTimeStamp()), 
      System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS); 
    timestamp.setText(timeAgo); 

    // Chcek for empty status message 
    if (!TextUtils.isEmpty(item.getStatus())) { 
     statusMsg.setText(item.getStatus()); 
     statusMsg.setVisibility(View.VISIBLE); 
    } else { 
     // status is empty, remove from view 
     statusMsg.setVisibility(View.GONE); 
    } 

    // Checking for null feed url 
    if (item.getUrl() != null) { 
     url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">" 
       + item.getUrl() + "</a> ")); 

     // Making url clickable 
     url.setMovementMethod(LinkMovementMethod.getInstance()); 
     url.setVisibility(View.VISIBLE); 
    } else { 
     // url is null, remove from the view 
     url.setVisibility(View.GONE); 
    } 

    // user profile pic 
    profilePic.setImageUrl(item.getProfilePic(), imageLoader); 

    // Feed image 
    if (item.getImge() != null) { 
     feedImageView.setImageUrl(item.getImge(), imageLoader); 
     feedImageView.setVisibility(View.VISIBLE); 
     feedImageView 
       .setResponseObserver(new FeedImageView.ResponseObserver() { 
        @Override 
        public void onError() { 
        } 

        @Override 
        public void onSuccess() { 
        } 
       }); 
    } else { 
     feedImageView.setVisibility(View.GONE); 
    } 
    return convertView; 
} 


private void parseJsonFeed(JSONObject response) { 
    int success; 
    try { 
     success = response.getInt(TAG_SUCCESS); 
     if (success == 1) { 
      notifyDataSetChanged(); 
     } else { 
      Toast.makeText(activity, "erreur", Toast.LENGTH_SHORT).show(); 
     } 


     //listAdapter.addAll(feedItems); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

}

FeedItem类

package com.example.mahdi.chat; 

public class FeedItem { 

private String id,name, status, image, profile_img, time, url,nbr_likes,nbr_comments; 

public FeedItem() { 
} 

public FeedItem(String id, String name, String image, String status, 
       String profilePic, String timeStamp, String url,String nbr_likes,String nbr_comments) { 
    super(); 
    this.id = id; 
    this.name = name; 
    this.image = image; 
    this.status = status; 
    this.profile_img = profilePic; 
    this.time = timeStamp; 
    this.url = url; 
    this.nbr_likes = nbr_likes; 
    this.nbr_comments = nbr_comments; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getImge() { 
    return image; 
} 

public void setImge(String image) { 
    this.image = image; 
} 

public String getStatus() { 
    return status; 
} 

public void setStatus(String status) { 
    this.status = status; 
} 

public String getProfilePic() { 
    return profile_img; 
} 

public void setProfilePic(String profilePic) { 
    this.profile_img = profilePic; 
} 

public String getTimeStamp() { 
    return time; 
} 

public void setTimeStamp(String timeStamp) { 
    this.time = timeStamp; 
} 

public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 

public String getNbrLikes() { 
    return nbr_likes; 
} 

public void setNbrLikes(String nbr_likes) { 
    this.nbr_likes = nbr_likes; 
} 

public String getNbrComments() { 
    return nbr_comments; 
} 

public void setNbrComments(String nbr_comments) { 
    this.nbr_comments = nbr_comments; 
} 

}

问题是按钮的样子,我想更改按钮时,其点击的.Thanks的绘制。

编辑:

package com.example.mahdi.chat; 


import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Color; 
import android.os.AsyncTask; 
import android.support.v4.app.Fragment; 
import android.text.Html; 
import android.text.TextUtils; 
import android.text.format.DateUtils; 
import android.text.method.LinkMovementMethod; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.VolleyLog; 
import com.android.volley.toolbox.ImageLoader; 
import com.android.volley.toolbox.NetworkImageView; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 
import org.w3c.dom.Text; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import circleview.CircleImageView; 

public class FeedListAdapter extends BaseAdapter { 

private static final String TAG = FeedListAdapter.class.getSimpleName(); 

private Activity activity; 
private LayoutInflater inflater; 
private List<FeedItem> feedItems; 
JSONParser jsonParser = new JSONParser(); 
private String URL = "http://10.0.3.2/social/like.php"; 
private String user_id; 
private Button like,comment; 

private static final String TAG_SUCCESS = "success"; 
FeedItem item; 
ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 

public FeedListAdapter(Activity activity, List<FeedItem> feedItems, String user_id) { 
    this.activity = activity; 
    this.feedItems = feedItems; 
    this.user_id = user_id; 
} 

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

@Override 
public Object getItem(int location) { 
    return feedItems.get(location); 
} 

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

public void refresh(List<FeedItem> newlist) { 
    feedItems.addAll(newlist); 
    this.notifyDataSetChanged(); 
} 
public List<FeedItem> getData() { 
    return feedItems; 
} 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (inflater == null) 
     inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (convertView == null) 
     convertView = inflater.inflate(R.layout.posts_row, null); 

    if (imageLoader == null) 
     imageLoader = AppController.getInstance().getImageLoader(); 

    final TextView name = (TextView) convertView.findViewById(R.id.name); 
    TextView timestamp = (TextView) convertView 
      .findViewById(R.id.time); 
    TextView statusMsg = (TextView) convertView 
      .findViewById(R.id.status); 
    TextView url = (TextView) convertView.findViewById(R.id.url); 
    CircleImageView profilePic = (CircleImageView) convertView 
      .findViewById(R.id.profile_img); 
    FeedImageView feedImageView = (FeedImageView) convertView 
      .findViewById(R.id.image); 


    TextView nbr_likes = (TextView)convertView.findViewById(R.id.nbr_likes); 
    TextView nbr_comments = (TextView)convertView.findViewById(R.id.nbr_comments); 


    item = feedItems.get(position); 




    like =(Button)convertView.findViewById(R.id.like); 
    comment =(Button)convertView.findViewById(R.id.comment); 



    like.setTag(position); 

    like.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 

      int position = (Integer) v.getTag(); 

      like.setBackgroundColor(Color.BLACK); 


      item = feedItems.get(position); 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("post_id", item.getId()); 
      params.put("user_id", user_id); 
      Toast.makeText(activity, item.getId(), Toast.LENGTH_SHORT).show(); 
      Toast.makeText(activity, user_id, Toast.LENGTH_SHORT).show(); 
      // making fresh volley request and getting json 
      CustomRequest jsonReq = new CustomRequest(Request.Method.POST, 
        URL,params , new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        VolleyLog.d(TAG, "Response: " + response.toString()); 
        if (response != null) { 

         parseJsonFeed(response); 


        } 
       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       } 
      }); 

      // Adding request to volley request queue 
      AppController.getInstance().addToRequestQueue(jsonReq); 



     } 

    }); 



    comment.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 
      item = feedItems.get(position); 
      Intent i = new Intent(activity, Comment.class); 
      i.putExtra("user_id",item.getId()); 
      i.putExtra("name",item.getName()); 
      i.putExtra("image",item.getImge()); 
      i.putExtra("status",item.getStatus()); 
      i.putExtra("profile_img",item.getProfilePic()); 
      i.putExtra("time",item.getTimeStamp()); 
      i.putExtra("url",item.getUrl()); 
      i.putExtra("nbr_likes",item.getNbrLikes()); 
      i.putExtra("nbr_comments",item.getNbrComments()); 
      activity.startActivity(i); 


     } 


    }); 

    name.setText(item.getName()); 

    nbr_likes.setText(item.getNbrLikes()+ " Likes"); 
    nbr_comments.setText(item.getNbrComments() + " Comments"); 


    // Converting timestamp into x ago format 
    CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
      Long.parseLong(item.getTimeStamp()), 
      System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS); 
    timestamp.setText(timeAgo); 

    // Chcek for empty status message 
    if (!TextUtils.isEmpty(item.getStatus())) { 
     statusMsg.setText(item.getStatus()); 
     statusMsg.setVisibility(View.VISIBLE); 
    } else { 
     // status is empty, remove from view 
     statusMsg.setVisibility(View.GONE); 
    } 

    // Checking for null feed url 
    if (item.getUrl() != null) { 
     url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">" 
       + item.getUrl() + "</a> ")); 

     // Making url clickable 
     url.setMovementMethod(LinkMovementMethod.getInstance()); 
     url.setVisibility(View.VISIBLE); 
    } else { 
     // url is null, remove from the view 
     url.setVisibility(View.GONE); 
    } 

    // user profile pic 
    profilePic.setImageUrl(item.getProfilePic(), imageLoader); 

    // Feed image 
    if (item.getImge() != null) { 
     feedImageView.setImageUrl(item.getImge(), imageLoader); 
     feedImageView.setVisibility(View.VISIBLE); 
     feedImageView 
       .setResponseObserver(new FeedImageView.ResponseObserver() { 
        @Override 
        public void onError() { 
        } 

        @Override 
        public void onSuccess() { 
        } 
       }); 
    } else { 
     feedImageView.setVisibility(View.GONE); 
    } 
    return convertView; 
} 


private void parseJsonFeed(JSONObject response) { 
    int success; 
    try { 
     success = response.getInt(TAG_SUCCESS); 
     if (success == 1) { 
      notifyDataSetChanged(); 
     } else { 
      Toast.makeText(activity, "erreur", Toast.LENGTH_SHORT).show(); 
     } 


     //listAdapter.addAll(feedItems); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

}

回答

3

假设按钮是列表视图内。 首先定义在适配器的getView功能按钮的点击监听器:

likebutton.setOnClickListener(likeButtonClickListener); 

然后定义的onclick监听器:

private OnClickListener likeButtonClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     View parentRow = (View) v.getParent(); 
     ListView listView = (ListView) parentRow.getParent(); 
     final int position = listView.getPositionForView(parentRow); 
    } 
}; 

也有通过在getView功能设置标签另一种方式:

likebutton.setTag(position); 
likebutton.setOnClickListener(likeButtonClickListener); 

在按钮点击侦听器中,我们将获取标签并找到位置值。

private OnClickListener likeButtonClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     int position = (Integer) v.getTag(); 
    } 
}; 

编辑:解释我在评论中提到的链接的解决方案。 他宣布了一个最终布尔变量mHighlightedPositions它提供信息是否选择了列表视图中高亮显示的位置。 如果这个变量返回true列表视图中的行被选中,所以你可以做的是。

声明一个变量“NUM_OF_ITEMS”作为整数和“mHighlightedPositions”作为您的适配器一个布尔值:

private int NUM_OF_ITEMS; 
private final boolean[] mHighlightedPositions = new boolean[NUM_OF_ITEMS]; 

有了这个,你可以,如果选择在ListView一个项目或定义不和应用背景/颜色到你的按钮像他一样:

... 
if(mHighlightedPositions[position]) { 
     holder.likebutton.setBackgroundResource(R.drawable.icon_yellow_star_large); 
    }else { 
     holder.likebutton.setBackgroundResource(0); 
    } 
... 

如果你想要按照他的例子,你还需要声明一个ViewHolder。

int position = (Integer)view.getTag(); 

参见下面的例子从链接:

@Override 
public void onClick(View view) { 
    int position = (Integer)view.getTag(); // gets current position 
    Log.d(TAG, "Button row pos click: " + position); 
    ... 
     ... 
    if(mHighlightedPositions[position]) { // current position is given 
     button.setBackgroundResource(0); 
     mHighlightedPositions[position] = false; 
    }else { 
     button.setBackgroundResource(R.drawable.icon_yellow_star_large); 
     mHighlightedPositions[position] = true; 
    } 
} 
+0

感谢您的帮助,但得到之后

holder = new ViewHolder(); 

项目的位置将由位置变量返回该位置,我怎么用它来改变特定按钮的背景。我只是做like.setBackgroundResource(R.drawable.like1); ?或者我需要做别的事情? – Frank

+0

@Frank,如果你只是想改变颜色,那么:likebutton.setBackgroundColor(Color.BLACK);如果你想使用drawable,那么:likebutton.setBackgroundResource(R.drawable.new_image); 如果这对你有帮助,请接受答案。 – Simon

+0

我认为我有一个位置问题,我点击像另一个按钮就像得到黑色不是我点击的那个,你知道问题来自哪里吗? – Frank

相关问题