Java 使用自定义适配器中的变量时出现问题
我正在使用列表视图并创建自定义适配器。每次点击按钮,我都会喜欢上一篇文章。正在声明的按钮与列表视图中的每个项相连接。我遇到了三个问题: 1) 当我点击like按钮时,列表下方的“随机”按钮也会被点击 2) 当我单击“喜欢”时,它会更新“喜欢”计数,但当我向下滚动出视图,然后向上滚动时,会重置“喜欢”计数 3) 当我点击like时,like计数会改变,现在当我在另一篇文章上点击like时,like计数会改变为我点击的第一个like按钮上的like计数 我已经在这上面停留了一段时间,非常感谢您的帮助 以下是适配器类的代码:Java 使用自定义适配器中的变量时出现问题,java,php,android,android-volley,custom-adapter,Java,Php,Android,Android Volley,Custom Adapter,我正在使用列表视图并创建自定义适配器。每次点击按钮,我都会喜欢上一篇文章。正在声明的按钮与列表视图中的每个项相连接。我遇到了三个问题: 1) 当我点击like按钮时,列表下方的“随机”按钮也会被点击 2) 当我单击“喜欢”时,它会更新“喜欢”计数,但当我向下滚动出视图,然后向上滚动时,会重置“喜欢”计数 3) 当我点击like时,like计数会改变,现在当我在另一篇文章上点击like时,like计数会改变为我点击的第一个like按钮上的like计数 我已经在这上面停留了一段时间,非常感谢您的帮助
class PostsAdapter extends ArrayAdapter<Posts> implements View.OnClickListener {
//used to create views from xml
private LayoutInflater layoutInflater;
public PostsAdapter(Context context, int textViewResourceId, List<Posts> posts) {
super(context, textViewResourceId, posts);
layoutInflater = LayoutInflater.from(context);
}
//add to xml from dataset
@Override
// view convertview = recycled view
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
Holder holder = null;
Posts posts = getItem(position);
//checks if recycled view is null, thewn creates new view, if not null, use same view
if(view == null){
view = layoutInflater.inflate(R.layout.activity_posts, null);
Button like = (Button) view.findViewById(R.id.btnLike);
TextView content = (TextView) view.findViewById(R.id.content);
TextView user = (TextView) view.findViewById(R.id.user);
TextView topic = (TextView) view.findViewById(R.id.topic);
TextView date = (TextView) view.findViewById(R.id.date);
TextView likes = (TextView) view.findViewById(R.id.likeCount);
TextView hiddenId = (TextView) view.findViewById(R.id.hiddenID);
holder = new Holder(content, user, topic, date, likes, hiddenId, like);
view.setTag(holder);
like.setTag(holder);
}
else{
holder = (Holder) view.getTag();
}
holder.content.setText(posts.getContent());
holder.user.setText(posts.getUser());
holder.topic.setText(posts.getTopic());
holder.date.setText(posts.getDate());
holder.likes.setText(posts.getLikes());
holder.hiddenId.setText(posts.getId());
holder.like.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
Button like = (Button) v;
Holder holder = (Holder) v.getTag();
Toast.makeText(DisplayPosts.this, "Button: " + like.getText(), Toast.LENGTH_LONG).show();
createLike(holder.like, holder.hiddenId, holder.likes);
}
}
static class Holder{
public TextView content;
public TextView user;
public TextView topic;
public TextView date;
public TextView likes;
public TextView hiddenId;
public Button like;
public Holder(TextView content, TextView user, TextView topic, TextView date, TextView likes, TextView hiddenId, Button like) {
this.content = content;
this.user = user;
this.topic = topic;
this.date = date;
this.likes = likes;
this.hiddenId = hiddenId;
this.like = like;
}
}
类PostsAdapter扩展了ArrayAdapter,实现了View.OnClickListener{
//用于从xml创建视图
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
公共PostsAdapter(上下文上下文、int textViewResourceId、列表帖子){
super(上下文、textViewResourceId、posts);
layoutInflater=layoutInflater.from(上下文);
}
//从数据集添加到xml
@凌驾
//视图转换视图=回收视图
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
Holder=null;
Posts Posts=getItem(position);
//检查回收视图是否为空,WN将创建新视图,如果不为空,则使用相同的视图
如果(视图==null){
视图=布局更平坦。充气(R.layout.activity\u posts,空);
Button-like=(Button)view.findViewById(R.id.btnLike);
TextView content=(TextView)view.findViewById(R.id.content);
TextView用户=(TextView)view.findViewById(R.id.user);
TextView topic=(TextView)view.findViewById(R.id.topic);
TextView日期=(TextView)view.findViewById(R.id.date);
TextView likes=(TextView)view.findViewById(R.id.likeCount);
TextView hiddenId=(TextView)view.findViewById(R.id.hiddenId);
holder=新的holder(内容、用户、主题、日期、喜欢的、隐藏的、喜欢的);
视图.设置标签(支架);
like.setTag(持有者);
}
否则{
holder=(holder)view.getTag();
}
holder.content.setText(posts.getContent());
holder.user.setText(posts.getUser());
holder.topic.setText(posts.getTopic());
holder.date.setText(posts.getDate());
holder.likes.setText(posts.getLikes());
holder.hiddenId.setText(posts.getId());
holder.like.setOnClickListener(this);
返回视图;
}
@凌驾
公共void onClick(视图v){
按钮状=(按钮)v;
Holder Holder=(Holder)v.getTag();
Toast.makeText(DisplayPosts.this,“按钮:+like.getText(),Toast.LENGTH\u LONG.show();
createLike(holder.like,holder.hiddenId,holder.likes);
}
}
静态类持有者{
公共文本查看内容;
公共文本视图用户;
公共文本视图主题;
公共文本查看日期;
公共文本视图;
公共文本视图隐藏;
公共按钮式;
公共持有者(文本视图内容、文本视图用户、文本视图主题、文本视图日期、文本视图类、文本视图隐藏ID、按钮类){
this.content=内容;
this.user=用户;
this.topic=主题;
this.date=日期;
this.likes=喜欢;
this.hiddenId=hiddenId;
this.like=like;
}
}
下面是createLike方法:
private void createLike(final Button like, final TextView hiddenid, final TextView likes){
final String hid = hiddenid.getText().toString().trim();
if(like.getText().toString().equalsIgnoreCase("like")){
like.setText("UnLike");
StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.SERVER_ADDRESS + "LikePost.php",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JSONObject jsonObject = null;
try {
//json string to jsonobject
jsonObject = new JSONObject(response);
//get json sstring created in php and store to JSON Array
result2 = jsonObject.getJSONArray(Config.json_array_likes);
//get username from json array
likes.setText(getLikeCount(result2));
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// corresponding values.
Map<String,String> hashMap = new HashMap<>();
//maps specified string key, to specified string value
hashMap.put(Config.hid, hid);
return hashMap;
}
};
//add string request to queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
else{
like.setText("Like");
}
}
private String getLikeCount(JSONArray jsonArray){
String lc = null;
for(int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject json = jsonArray.getJSONObject(i);
likeCount.add(json.getString(Config.getLike));
lc = likeCount.get(0);
} catch (JSONException e) {
}
}
return lc;
}
private void createLike(最终按钮式、最终文本视图隐藏式、最终文本视图式){
最后一个字符串hid=hiddenid.getText().toString().trim();
if(like.getText().toString().equalsIgnoreCase(“like”)){
like.setText(“不像”);
StringRequest StringRequest=new StringRequest(Request.Method.POST,Config.SERVER_ADDRESS+“LikePost.php”,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
JSONObject JSONObject=null;
试一试{
//json字符串到jsonobject
jsonObject=新的jsonObject(响应);
//获取在php中创建的json字符串并存储到json数组
result2=jsonObject.getJSONArray(Config.json\u array\u);
//从json数组获取用户名
likes.setText(getLikeCount(result2));
}捕获(JSONException e){
e、 printStackTrace();
}
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
}
}){
@凌驾
受保护的映射getParams()引发AuthFailureError{
//相应的值。
Map hashMap=新hashMap();
//将指定的字符串键映射到指定的字符串值
put(Config.hid,hid);
返回hashMap;
}
};
//将字符串请求添加到队列
RequestQueue RequestQueue=Volley.newRequestQueue(this);
添加(stringRequest);
}
否则{
like.setText(“like”);
}
}
私有字符串getLikeCount(JSONArray JSONArray){
字符串lc=null;
for(int i=0;i
我认为根本问题在于您在holder类上使用了静态修饰符,请删除该修饰符
holder.like.setOnClickListener(this);
holder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createLike(position,holder.like, holder.hiddenId, holder.likes);//Added one more parameter "position"
}
);
@Override
public void onResponse(String response) {
JSONObject jsonObject = null;
try {
//json string to jsonobject
jsonObject = new JSONObject(response);
//get json sstring created in php and store to JSON Array
result2 = jsonObject.getJSONArray(Config.json_array_likes);
//get username from json array
likes.setText(getLikeCount(result2));
//Update like count here
posts.get(position).setLikeCount(); //The count which you want to update
} catch (JSONException e) {
e.printStackTrace();
}
}
public class PostsAdapter extends ArrayAdapter<Posts> {
//used to create views from xml
Context context;
int textViewResourceId;
ArrayList<Posts> mPosts = new ArrayList<Posts>();
public PostsAdapter(Context context, int textViewResourceId, ArrayList<Posts> posts) {
super(context, textViewResourceId, posts);
this.textViewResourceId = textViewResourceId;
this.context = context;
this.mPosts = posts;
}
// view convertview = recycled view
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final Holder holder;
//checks if recycled view is null, thewn creates new view, if not null, use same view
if(view == null){
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
view = inflater.inflate(textViewResourceId, parent, false);
Button like = (Button) view.findViewById(R.id.btnLike);
TextView content = (TextView) view.findViewById(R.id.content);
TextView user = (TextView) view.findViewById(R.id.user);
TextView topic = (TextView) view.findViewById(R.id.topic);
TextView date = (TextView) view.findViewById(R.id.date);
TextView likes = (TextView) view.findViewById(R.id.likeCount);
TextView hiddenId = (TextView) view.findViewById(R.id.hiddenID);
holder = new Holder(content, user, topic, date, likes, hiddenId, like);
view.setTag(holder);
}
else{
holder = (Holder) view.getTag();
}
Posts posts = mPosts.get(position);
holder.content.setText(posts.getContent());
holder.user.setText(posts.getUser());
holder.topic.setText(posts.getTopic());
holder.date.setText(posts.getDate());
holder.likes.setText(posts.getLikes());
holder.hiddenId.setText(posts.getId());
holder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createLike(position, holder.like, holder.hiddenId, holder.likes);//Added one more parameter "position"
}
});
return view;
}
private void createLike(final int position, final Button like, final TextView hiddenid, final TextView likes){
final String hid = hiddenid.getText().toString().trim();
if(like.getText().toString().equalsIgnoreCase("like")){
like.setText("UnLike");
StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.SERVER_ADDRESS + "LikePost.php",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JSONObject jsonObject = null;
try {
//counter
n+=1;
//json string to jsonobject
jsonObject = new JSONObject(response);
//get json sstring created in php and store to JSON Array
result2 = jsonObject.getJSONArray(Config.json_array_likes);
//get username from json array
String likestring = getLikeCount(result2);
String likenum = mPosts.get(position).getLikes(likestring);
likes.setText(likenum);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// corresponding values.
Map<String,String> hashMap = new HashMap<>();
//maps specified string key, to specified string value
hashMap.put(Config.hid, hid);
return hashMap;
}
};
//add string request to queue
RequestQueue requestQueue = Volley.newRequestQueue(DisplayPosts.this);
requestQueue.add(stringRequest);
}
else{
like.setText("Like");
}
}
private String getLikeCount(JSONArray jsonArray){
System.out.println("JSON: " + jsonArray);
String lc = null;
for(int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject json = jsonArray.getJSONObject(i);
likeCount.add(json.getString(Config.getLike));
System.out.println("i: " + i);
lc = likeCount.get(n - 1);
} catch (JSONException e) {
}
}
System.out.println("LC: " + lc);
return lc;
}
class Holder{
public TextView content;
public TextView user;
public TextView topic;
public TextView date;
public TextView likes;
public TextView hiddenId;
public Button like;
public Holder(TextView content, TextView user, TextView topic, TextView date, TextView likes, TextView hiddenId, Button like) {
this.content = content;
this.user = user;
this.topic = topic;
this.date = date;
this.likes = likes;
this.hiddenId = hiddenId;
this.like = like;
}
}
}