ListView 点击一个item另外几个Item响应(估计好多人没遇到过)

王玉超 2013-05-13 11:16:24
问题是这个样的,我自己定义一个ListViewAdapter继承的BaseAdapter,但是在getView方法中出问题了,比如说是我点击Item中的一个按钮,position为0,结果响应的是0,5,10,15(总共数据就20条,position最大19),这个是什么情况呀,还有,如果我自己用ViewHolder写的话,那么响应的直接就是随机的其他按钮。
public View getView(final int position, View view, ViewGroup parent) {
// holder = new ViewHolder();
if (view == null) {
view = inflater.inflate(R.layout.custom_list_item, null);
}

final Button praise = (Button) view.findViewById(R.id.praise);
praise.setText(allMessage.get(position).getPraNum() + "");
praise.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (isPraised(allMessage.get(position).getMsgId())) {
ViewUtil.toastShort("你已经赞过了", (MainActivity) context);
return;
}
praise.setText(allMessage.get(position).getPraNum() + 1 + "");
praise.setBackgroundResource(R.drawable.message_praise_yes);
new DownLoadThread(handler, allMessage.get(position).getMsgId())
.start();
}
});
}

求大神指教呀。。。。不知道啥情况。。。以前从没出现这种问题,监听混乱了,肿么办?急急急。。。
...全文
1174 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊猫哥123 2015-02-12
  • 打赏
  • 举报
回复
		
//不加这段就会出现混乱
switch(curr.getVisibleState())
		{
			case 1:
				holder.content.setVisibility(View.VISIBLE);
				break;
			case 0:
				holder.content.setVisibility(View.GONE);
				break;
		}		
		
//监听状态,更新状态码
		trasHolder.arrow_down.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				if(curr.getVisibleState() == 1){
					curr.setVisibleState(0);
					trasHolder.content.setVisibility(View.GONE);
				}else{
					curr.setVisibleState(1);
					trasHolder.content.setVisibility(View.VISIBLE);
				}
				
			}
		});
tiantuo007 2015-01-14
  • 打赏
  • 举报
回复
你那个isRenew()的方法怎么写的啊
tomeryly 2014-08-20
  • 打赏
  • 举报
回复
引用 26 楼 abfo12 的回复:
楼主,你好!我的也出现和你一样的状况。我的代码如下,麻烦帮忙看看哪里出了问题。小的不才,你提供的那段代码,我看不出具体在哪段代码上解决了问题。 public class ContactInviteAdapter extends BaseAdapter { private Context mContext; private List<HashMap<String, Object>> contactLists; private LayoutInflater inflater; private boolean img_Flag = false; HashMap<Integer, Boolean> state = new HashMap<Integer, Boolean>(); //主要用来存储position对应的boolean数据 public ContactInviteAdapter(Context context, List<HashMap<String, Object>> contactFriends) { mContext = context; this.contactLists = contactFriends; inflater = LayoutInflater.from(mContext); initMap(); } private void initMap() { for (int i = 0; i < contactLists.size(); i++) { state.put(i, false); } } @Override public int getCount() { return contactLists == null?0:contactLists.size(); } @Override public Object getItem(int arg0) { return contactLists == null?0:contactLists.get(arg0); } @Override public long getItemId(int arg0) { return contactLists.indexOf(contactLists.get(arg0)); } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder = new ViewHolder(); View view = convertView; if(view == null) { view = inflater.inflate(R.layout.contact_find_all, null); } else { view = convertView; } holder.imgCheck = (ImageView) view.findViewById(R.id.contact_find_all_edit_id); holder.imgHead = (ImageView) view.findViewById(R.id.contact_img_id); holder.tvName = (TextView) view.findViewById(R.id.contact_name_id); holder.tvNumber = (TextView) view.findViewById(R.id.contact_number_id); holder.tvInvite = (TextView) view.findViewById(R.id.contact_inviteby_id); holder.imgHead.setBackgroundResource((Integer) contactLists.get(position).get("contactinviteimgHead")); holder.tvName.setText(contactLists.get(position).get("contactinvitename").toString()); holder.tvNumber.setText(contactLists.get(position).get("contactinvitenumber").toString()); holder.tvInvite.setText(contactLists.get(position).get("contactinviteBy").toString()); holder.imgCheck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!state.get(position)) { holder.imgCheck.setImageDrawable(mContext.getResources().getDrawable(R.drawable.invitebuttonbk33)); } else { ; } img_Flag = !state.get(position); state.put(position, img_Flag); notifyDataSetChanged(); } }); return view; } static class ViewHolder { ImageView imgCheck; ImageView imgHead; TextView tvName; TextView tvNumber; TextView tvInvite; } }
我都是这样的写法,但就还是有问题?求解答~
王玉超 2013-11-21
  • 打赏
  • 举报
回复
package com.mars.library.adapter;

import java.util.ArrayList;
import java.util.HashMap;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.mars.library.entry.BookMyBorrow;
import com.mars.library.main.R;
import com.mars.library.util.BookDetailHandler;
import com.mars.library.util.ConstantUtil;
import com.mars.library.util.RequestThread;
import com.mars.library.util.VarUtil;
import com.mars.library.util.ViewUtil;

/**
 * Book简单的适配器
 * 
 * @author Administrator
 * 
 */
@SuppressLint({ "HandlerLeak", "UseSparseArrays" })
public class ListViewBookMyBorrowAdapter extends BaseAdapter {

	private Context context;
	private ArrayList<BookMyBorrow> allBook;
	private LayoutInflater inflater;
	
	//同学:保存按钮的状态,来判断是否有这个按钮。不保存状态的话,下拉以后就可能不显示了。
	//同学:因为这个保存是全部保存,而ListView的机制,是保存当前显示的,所以那个不靠谱。但是那个省内存。所以需要保存状态再保存,不需要就不要保存
	private HashMap<Integer, Boolean> isCanRenew = new HashMap<Integer, Boolean>();

	public ListViewBookMyBorrowAdapter(Context context, ArrayList<BookMyBorrow> allBook) {
		this.context = context;
		this.allBook = allBook;
		this.inflater = LayoutInflater.from(context);
	}

	@Override
	public View getView(final int position, View view, ViewGroup parent) {
		// 如果不加这行代码,很容易溢出
		if (view == null) {
			view = inflater.inflate(R.layout.book_my_borrow_item, null);
		}
		if (allBook.isEmpty()) {
			return view;
		}
		final ViewHolder holder = new ViewHolder();

		holder.item = (RelativeLayout) view.findViewById(R.id.item);
		holder.number = (TextView) view.findViewById(R.id.number);
		holder.name = (TextView) view.findViewById(R.id.name);
		holder.date = (TextView) view.findViewById(R.id.date);
		holder.renew = (Button) view.findViewById(R.id.renew);
		holder.progress = (ProgressBar) view.findViewById(R.id.progressBar);

		holder.number.setText(allBook.get(position).getId());
		holder.name.setText(allBook.get(position).getName());
		holder.date.setText(allBook.get(position).getDate());

		// 点击列表查看图书的详细信息
		holder.item.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				lookUpBookDetail(position);
			}
		});

		//同学:看这里
		isCanRenew.put(position, allBook.get(position).isRenew());// 保存

		//同学:看这里
		if (isCanRenew.get(position) == false) {// 如果不可用
			holder.renew.setVisibility(View.GONE);
		} else {// 如果可以续借
			holder.renew.setVisibility(View.VISIBLE);
			holder.renew.setEnabled(true);
		}

		holder.renew.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String url = VarUtil.URL + "/renew";
				HashMap<String, String> allParams = new HashMap<String, String>();
				allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount());
				allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword());
				allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode());
				allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position).getDepartmentId());
				allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId());
				VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder),
						allParams));
			}
		});

//		if (allBook.get(position).isRenew() == false) {
//			holder.renew.setVisibility(View.GONE);
//		} else {
//			holder.renew.setVisibility(View.VISIBLE);
//			holder.renew.setEnabled(true);
//
//			holder.renew.setOnClickListener(new OnClickListener() {
//				@Override
//				public void onClick(View v) {
//					String url = VarUtil.URL + "/renew";
//					HashMap<String, String> allParams = new HashMap<String, String>();
//					allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount());
//					allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword());
//					allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode());
//					allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position)
//							.getDepartmentId());
//					allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId());
//					VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder),
//							allParams));
//				}
//			});
//		}

		return view;
	}

	private void lookUpBookDetail(int position) {
		// 根据参数,请求数据
		String url = ConstantUtil.URL + "/lib/detail.aspx";
		HashMap<String, String> allParams = new HashMap<String, String>();
		allParams.put(ConstantUtil.DETAIL, "true");
		allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode());

		BookDetailHandler handler = new BookDetailHandler((Activity) context);

		VarUtil.threadPool.submit(new RequestThread(url, handler, allParams));
	}

	private class RenewHandler extends Handler {
		private ViewHolder holder;

		public RenewHandler(ViewHolder holder) {
			this.holder = holder;
		}

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			// 任务开始
			case ConstantUtil.START:
				holder.renew.setVisibility(View.INVISIBLE);
				holder.progress.setVisibility(View.VISIBLE);
				break;
			// 任务结束
			case ConstantUtil.END:
				if (VarUtil.result.equals(ConstantUtil.SUCCESS)) {
					holder.renew.setVisibility(View.GONE);
					holder.progress.setVisibility(View.GONE);
				} else if (VarUtil.result.equals(ConstantUtil.FAIL)) {
					holder.renew.setVisibility(View.VISIBLE);
					holder.progress.setVisibility(View.INVISIBLE);
					ViewUtil.toastShort("续借失败!", (Activity) context);
				}
				break;
			// 任务出错
			case ConstantUtil.INTERNET_ERROR:
				ViewUtil.toastShort("客户端网络异常!请您稍后重试!", (Activity) context);
				break;
			default:
				break;
			}
		}
	}

	class ViewHolder {
		RelativeLayout item;
		TextView number;
		TextView name;
		TextView date;
		Button renew;
		ProgressBar progress;
	}

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

	@Override
	public Object getItem(int arg0) {
		return allBook.get(arg0);
	}

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

}
王玉超 2013-11-21
  • 打赏
  • 举报
回复
package com.mars.library.adapter; import java.util.ArrayList; import java.util.HashMap; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import com.mars.library.entry.BookMyBorrow; import com.mars.library.main.R; import com.mars.library.util.BookDetailHandler; import com.mars.library.util.ConstantUtil; import com.mars.library.util.RequestThread; import com.mars.library.util.VarUtil; import com.mars.library.util.ViewUtil; /** * Book简单的适配器 * * @author Administrator * */ @SuppressLint({ "HandlerLeak", "UseSparseArrays" }) public class ListViewBookMyBorrowAdapter extends BaseAdapter { private Context context; private ArrayList<BookMyBorrow> allBook; private LayoutInflater inflater; //同学:保存按钮的状态,来判断是否有这个按钮。不保存状态的话,下拉以后就可能不显示了。 //同学:因为这个保存是全部保存,而ListView的机制,是保存当前显示的,所以那个不靠谱。但是那个省内存。所以需要保存状态再保存,不需要就不要保存 private HashMap<Integer, Boolean> isCanRenew = new HashMap<Integer, Boolean>(); public ListViewBookMyBorrowAdapter(Context context, ArrayList<BookMyBorrow> allBook) { this.context = context; this.allBook = allBook; this.inflater = LayoutInflater.from(context); } @Override public View getView(final int position, View view, ViewGroup parent) { // 如果不加这行代码,很容易溢出 if (view == null) { view = inflater.inflate(R.layout.book_my_borrow_item, null); } if (allBook.isEmpty()) { return view; } final ViewHolder holder = new ViewHolder(); holder.item = (RelativeLayout) view.findViewById(R.id.item); holder.number = (TextView) view.findViewById(R.id.number); holder.name = (TextView) view.findViewById(R.id.name); holder.date = (TextView) view.findViewById(R.id.date); holder.renew = (Button) view.findViewById(R.id.renew); holder.progress = (ProgressBar) view.findViewById(R.id.progressBar); holder.number.setText(allBook.get(position).getId()); holder.name.setText(allBook.get(position).getName()); holder.date.setText(allBook.get(position).getDate()); // 点击列表查看图书的详细信息 holder.item.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { lookUpBookDetail(position); } }); //同学:看这里 isCanRenew.put(position, allBook.get(position).isRenew());// 保存 //同学:看这里 if (isCanRenew.get(position) == false) {// 如果不可用 holder.renew.setVisibility(View.GONE); } else {// 如果可以续借 holder.renew.setVisibility(View.VISIBLE); holder.renew.setEnabled(true); } holder.renew.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String url = VarUtil.URL + "/renew"; HashMap<String, String> allParams = new HashMap<String, String>(); allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount()); allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword()); allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode()); allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position).getDepartmentId()); allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId()); VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder), allParams)); } }); // if (allBook.get(position).isRenew() == false) { // holder.renew.setVisibility(View.GONE); // } else { // holder.renew.setVisibility(View.VISIBLE); // holder.renew.setEnabled(true); // // holder.renew.setOnClickListener(new OnClickListener() { // @Override // public void onClick(View v) { // String url = VarUtil.URL + "/renew"; // HashMap<String, String> allParams = new HashMap<String, String>(); // allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount()); // allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword()); // allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode()); // allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position) // .getDepartmentId()); // allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId()); // VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder), // allParams)); // } // }); // } return view; } private void lookUpBookDetail(int position) { // 根据参数,请求数据 String url = ConstantUtil.URL + "/lib/detail.aspx"; HashMap<String, String> allParams = new HashMap<String, String>(); allParams.put(ConstantUtil.DETAIL, "true"); allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode()); BookDetailHandler handler = new BookDetailHandler((Activity) context); VarUtil.threadPool.submit(new RequestThread(url, handler, allParams)); } private class RenewHandler extends Handler { private ViewHolder holder; public RenewHandler(ViewHolder holder) { this.holder = holder; } @Override public void handleMessage(Message msg) { switch (msg.what) { // 任务开始 case ConstantUtil.START: holder.renew.setVisibility(View.INVISIBLE); holder.progress.setVisibility(View.VISIBLE); break; // 任务结束 case ConstantUtil.END: if (VarUtil.result.equals(ConstantUtil.SUCCESS)) { holder.renew.setVisibility(View.GONE); holder.progress.setVisibility(View.GONE); } else if (VarUtil.result.equals(ConstantUtil.FAIL)) { holder.renew.setVisibility(View.VISIBLE); holder.progress.setVisibility(View.INVISIBLE); ViewUtil.toastShort("续借失败!", (Activity) context); } break; // 任务出错 case ConstantUtil.INTERNET_ERROR: ViewUtil.toastShort("客户端网络异常!请您稍后重试!", (Activity) context); break; default: break; } } } class ViewHolder { RelativeLayout item; TextView number; TextView name; TextView date; Button renew; ProgressBar progress; } @Override public int getCount() { return allBook.size(); } @Override public Object getItem(int arg0) { return allBook.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } } 不懂的再发我邮箱1154786190@qq.com
abfo12 2013-11-21
  • 打赏
  • 举报
回复
楼主,你好!我的也出现和你一样的状况。我的代码如下,麻烦帮忙看看哪里出了问题。小的不才,你提供的那段代码,我看不出具体在哪段代码上解决了问题。 public class ContactInviteAdapter extends BaseAdapter { private Context mContext; private List<HashMap<String, Object>> contactLists; private LayoutInflater inflater; private boolean img_Flag = false; HashMap<Integer, Boolean> state = new HashMap<Integer, Boolean>(); //主要用来存储position对应的boolean数据 public ContactInviteAdapter(Context context, List<HashMap<String, Object>> contactFriends) { mContext = context; this.contactLists = contactFriends; inflater = LayoutInflater.from(mContext); initMap(); } private void initMap() { for (int i = 0; i < contactLists.size(); i++) { state.put(i, false); } } @Override public int getCount() { return contactLists == null?0:contactLists.size(); } @Override public Object getItem(int arg0) { return contactLists == null?0:contactLists.get(arg0); } @Override public long getItemId(int arg0) { return contactLists.indexOf(contactLists.get(arg0)); } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder = new ViewHolder(); View view = convertView; if(view == null) { view = inflater.inflate(R.layout.contact_find_all, null); } else { view = convertView; } holder.imgCheck = (ImageView) view.findViewById(R.id.contact_find_all_edit_id); holder.imgHead = (ImageView) view.findViewById(R.id.contact_img_id); holder.tvName = (TextView) view.findViewById(R.id.contact_name_id); holder.tvNumber = (TextView) view.findViewById(R.id.contact_number_id); holder.tvInvite = (TextView) view.findViewById(R.id.contact_inviteby_id); holder.imgHead.setBackgroundResource((Integer) contactLists.get(position).get("contactinviteimgHead")); holder.tvName.setText(contactLists.get(position).get("contactinvitename").toString()); holder.tvNumber.setText(contactLists.get(position).get("contactinvitenumber").toString()); holder.tvInvite.setText(contactLists.get(position).get("contactinviteBy").toString()); holder.imgCheck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!state.get(position)) { holder.imgCheck.setImageDrawable(mContext.getResources().getDrawable(R.drawable.invitebuttonbk33)); } else { ; } img_Flag = !state.get(position); state.put(position, img_Flag); notifyDataSetChanged(); } }); return view; } static class ViewHolder { ImageView imgCheck; ImageView imgHead; TextView tvName; TextView tvNumber; TextView tvInvite; } }
新靖界 2013-11-21
  • 打赏
  • 举报
回复
楼主,我现在遇到的问题跟你一样,能把你的那份代码发我参考下吗,谢谢!469197334@qq.com
xk1378522 2013-11-07
  • 打赏
  • 举报
回复
楼主怎么解决的啊 发我份源码把 1246805489@qq.com 急求 谢谢
xiaoge74 2013-09-18
  • 打赏
  • 举报
回复
楼主怎么解决的 可发我份源码 2682404611@qq.com
gjhrhuan 2013-06-27
  • 打赏
  • 举报
回复
楼主能否说的具体点啊,急啊,谢了
gjhrhuan 2013-06-27
  • 打赏
  • 举报
回复
我也遇到此问题了,头疼,求解啊 361907106@qq.com,万分感谢!
4代目火影 2013-06-17
  • 打赏
  • 举报
回复
同遇到此问题,求源码1041190806@qq.com
bathfire 2013-06-13
  • 打赏
  • 举报
回复
我也遇到这个问题,ListFragment中的监听item点击事件,结果点第一个item,第7,14,21都会响应,本人手机是三星note2,然后换了同事的魅族,结果是0,5,10,15一起响应。楼主怎么解决的,具体代码发一份给我吧,ctz830404@163.com
王玉超 2013-05-14
  • 打赏
  • 举报
回复
问题解决了,这是布局的滚动混乱问题,我一开始就应该想到的,可以监听到东西,滚动的时候会在别的地方出现,解决办法,就是定义一个List或者map将每个Item的状态保存下来就行了。。。。谢谢各位大哥。额。。
zhjh5555 2013-05-14
  • 打赏
  • 举报
回复
代码看了半天也没看出问题来,布局会对这个影响?
Iam浩浩 2013-05-13
  • 打赏
  • 举报
回复
我是这样写的,每个list item里面的控件的监听事件OnClickListener在getView里面注册,而list的点击事件OnItemClickListener写在继承listActivity的那个文件里
手指风 2013-05-13
  • 打赏
  • 举报
回复

public View getView(final int position, View view, ViewGroup parent) {
		// holder = new ViewHolder();
		if (view == null) {
			view = inflater.inflate(R.layout.custom_list_item, null);
		}

		final Button praise = (Button) view.findViewById(R.id.praise);
		praise.setText(allMessage.get(position).getPraNum() + "");
		praise.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (isPraised(allMessage.get(position).getMsgId())) {
					ViewUtil.toastShort("你已经赞过了", context);
					return;
				}
                                Button btn = (Button)v;
				btn.setText(allMessage.get(position).getPraNum() + 1 + "");
				btn.setBackgroundResource(R.drawable.message_praise_yes);
				new DownLoadThread(handler, allMessage.get(position).getMsgId())
						.start();
			}
		});
	}
王玉超 2013-05-13
  • 打赏
  • 举报
回复
ListView中不是有很多Item么,每个Item中有很多控件,我还要对各个控件进行监听。明白???
wlcw16 2013-05-13
  • 打赏
  • 举报
回复
我不仅要监听里面的各个控件,还要监听总的Item 这句话什么意思? 用listView.setOnItemClickListener也一样啊 我感觉你的错误应该是被点击的position和convertView混乱了导致的。 先写到OnItemClickListener里试试。
王玉超 2013-05-13
  • 打赏
  • 举报
回复
看来大家估计都没遇到过,谁可以给我一份正规的getView方法呀,有Item里面的各种控件的监听。。。邮箱1154786190@qq.com。。。。不胜感激。。。。
加载更多回复(9)

80,469

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧