android的setadapter getview的getview里面的控件,settext和setOnClickListener报错。可能是什么原因。附代码

Error 404 (Not Found)!!1
404. That’s an error.
The requested URL /538434/ was not found on this server.
That’s all we know.Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter&T&, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.我猜想这些Adapter的区别在于你的数据来源不一样:比如若你的数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用SimpleCursorAdapter等。就目前我经常使用的BaseAdapter和SimpleCursorAdapter。
1,BaseAdapter:---数据来源于Arraylist--&MyArraylist
当你继承BaseAdapter客制化你的Adapter时,你必须OverWrite以下函数:
public int getCount() {
// TODO Auto-generated method stub
System.out.println("the size is\t" +
MyArraylist.size());
return MyArraylist.size();
getCount返回的就是你的有多少条数据需要绑定的,也就是需要多少个View.比如这里返回的就是MyArraylist的Size.
public View getView(int position, View v, ViewGroup parent) {
// TODO Auto-generated method stub
if (v == null) {
view = mInflater.inflate(R.layout.track_list_item, null);
通过getView就获得了view来显示数据了。在这里你就可以自定义你的View了,但你通过XML定义可以通过LayoutInflater来inflater你的XML。getView里面就可以将MyArraylist的数据通过position 这个来将数据一条绑定一个View了。
2,SimpleCursorAdapter:---数据来源于数据库---&MyCursor
转自:http://blog.csdn.net/wong_judy/archive//5466583.aspx
要实现bindView()和newView()这两个抽象方法需要实现的内容。
public void bindView(View view, Context context, Cursor cursor),重用一个已有的view,使其显示当前cursor所指向的数据。
public View newView(Context context, Cursor cursor, ViewGroup parent),为cursor所指向的数据新建一个View对象,并显示其数据。
通俗的说:比如你一个listview在一个屏幕里一次只能显示8条数据,那么第一次显示的时候就会newView 8次生成8个View,调用bindView绑定8条数据,而你有16条数据,但你拖动滚动条看9-16条时,此时不会再调用newView了,而只能调用了bindView去绑定新的数据而了。这样就省了空间了。
注意:传入到CursorAdapter中的Cursor结果集必须包含有列名为_id的列,否则SimpleCursorAdapter将不会起作用。
对于SimpleCursorAdapter中的newView与bindView的作用在BaseAdapter中的getView中也有这样的意义:getView里面我们必须做判断才能达到这种效果,就是要判断第二个参数View的是否为空:当空时就Infalte新的View,但不为空时就要就用它,这样就第一屏幕Infate 8个View,后面就直接使用这个8个view了。
注意:getView中是返回一个view,必须返回的是你infalte之后不为空的View,不然会报空指针异常。
==================================================================
关于ListView选中时显示的效果。
通过给listview设置 android:listSelector这个属性,就可以对其下的所有item设定state_focused 时的背景变化
方法二:
实际上很简单,就是点击一下改变listviewitem的背景
public void changeBg(int position){
isFocused[whichClick==-1?0:whichClick] =
whichClick =
isFocused[position] =
notifyDataSetChanged();
package com.ui.
import java.util.L
import java.util.M
import android.app.AlertD
import android.app.D
import android.content.C
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.B
import android.widget.TextV
import android.widget.T
public class MyArrayAdapter extends BaseAdapter{
private static List&Map&String,String&&
private LayoutInflater mI
private ViewH
//alertdialog 被选中初始化false
private static boolean[] isF
private static int whichClick = -1;
Context mC
public MyArrayAdapter(Context context,List&Map&String,String&& objects){
mContext =
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
isFocused = new boolean[objects.size()];
for(int i=0;i&objects.size();i++){
isFocused[i] =
public int getCount() {
return list.size();
public Object getItem(int position) {
return list.get(position);
public long getItemId(int position) {
public void changeBg(int position){
isFocused[whichClick==-1?0:whichClick] =
whichClick =
isFocused[position] =
notifyDataSetChanged();
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.musiccategories, null);
holder = new ViewHolder();
holder.s_Name = (TextView) convertView.findViewById(R.id.s_name);
holder.btnTest = (Button) convertView.findViewById(R.id.btnTest);
holder.btnTest.setText("Kaden");
holder.btnTest.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(mContext, "Button clicked.", Toast.LENGTH_SHORT).show();
convertView.setTag(holder);
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
holder = (ViewHolder) convertView.getTag();
convertView.setBackgroundResource(isFocused[position]?R.drawable.btn_down_bg:R.drawable.btn_up_bg);
//holder.s_Name.setText(list.get(position).get(WebTools.SON_GEMING));
return convertV
static class ViewHolder {
TextView s_N
Button btnT
package com.ui.
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import android.app.A
import android.os.B
import android.view.V
import android.widget.AdapterV
import android.widget.ListV
import android.widget.AdapterView.OnItemClickL
* @Title: ListviewTest.java
* @Package com.ui.demo
* @Description: TODO
* @author Kaden Kang E-mail:
* @version Create date: 下午12:10:13
* @version V1.0
public class ListviewTest extends Activity {
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.my_listview);
List&Map&String, String&& listItem = new ArrayList&Map&String, String&&();
Map&String, String&
map = new HashMap&String, String&();
map.put("ItemTitle", "China");
map.put("ItemInfo", "+86");
listItem.add(map);
map = new HashMap&String, String&();
map.put("ItemTitle", "Iran");
map.put("ItemInfo", "+98");
listItem.add(map);
map = new HashMap&String, String&();
map.put("ItemTitle", "Iraq");
map.put("ItemInfo", "+964");
listItem.add(map);
map = new HashMap&String, String&();
map.put("ItemTitle", "Ireland");
map.put("ItemInfo", "+353");
listItem.add(map);
map = new HashMap&String, String&();
map.put("ItemTitle", "Israel");
map.put("ItemInfo", "+972");
listItem.add(map);
map = new HashMap&String, String&();
map.put("ItemTitle", "American");
map.put("ItemInfo", "+001");
listItem.add(map);
ListView listView = (ListView)findViewById(R.id.mListView);
final MyArrayAdapter adapter = new MyArrayAdapter(this, listItem);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& arg0, View arg1, int arg2,
long arg3) {
adapter.changeBg(arg2);
浏览 18560
浏览: 219566 次
来自: 西安
custom debug keystore/key must
丨悟空 写道如果只是提示安装失败而控制台和logcat都没有错 ...
如果只是提示安装失败而控制台和logcat都没有错误信息呢?
leehonpjp 写道老兄,第一种方法怎么弄?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'ListView的setOnClickListener失效
如果ListView中的单个Item的view中存在checkbox,button等view,会导致ListView.setOnItemClickListener无效,
事件会被子View捕获到,ListView无法捕获处理该事件.
解决方法:
在checkbox、button对应的view处加:focusable="false"
android:clickable="false" android:focusableInTouchMode="false"
其中focusable是关键
从OnClickListener调用getSelectedItemPosition(),Click 和selection 是不相关的,Selection是通过D-pad or trackball 来操作的,Click通常是点击操作的。
arg2参数才是点击事件位置的参数
第二种方法 就是在自己的getView中
convertView = mInflater . inflate ( R . layout . list_item_text , null );
convertView . setClickable ( true );
convertView . setOnClickListener ( clickListener );
public OnClickListener myClickListener = new OnClickListener () {
public void onClick ( View v ) {
//code to be written to handle the click event
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Android中RecyclerView的adapter封装 | 王艳涛的专栏
概述android开发中经常用到ListView、RecyclerView等列表控件,为了增强这类控件的显示和灵活应用,需要自己继承和重写android提供的adapter类。但是android提供的adapter都比较抽象,重写时会产生大量重复代码,所以进行封装后再使用是一个很必要的步骤。既然是封装就要达到下面两个要求:
代码:尽量减少重复代码;
功能:能够方便的获取Item布局中控件,并进行操作。
未封装的adapter首先分析下未封装时的adapter使用代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public class MyAdapter extends RecyclerView.Adapter&RecyclerView.ViewHolder& {
private LayoutInflater layoutI
List&MyData&
public MyAdapter(Context context) {
this.context =
layoutInflater = LayoutInflater.from(context);
public void setData(List&MyData& data) {
this.data =
notifyDataSetChanged();
public List&MyData& getData() {
public int getItemCount() {
return data == null ? 0 : data.size();
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.item_news_list1, parent, false);
return new MyHolder(view);
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
((MyHolder) holder).tvTitle.setText(data.getTitle());
public class MyHolder extends RecyclerView.ViewHolder {
TextView tvTitle, tvSource, tvPubD
public MyHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
}}
从上面代码可以看出,影响adapter复用主要有三个方面的因素:
每次使用adapter时,都需要传进一个集合数据,类型是自定义的,如List中的MyData等,所以进行封装成基类adapter时,应该消除基类对集合数据类型敏感性,解决方案为:引入泛型。
Myholder作为adapter的内部类,不同的adapter一般需要不同的holder,所以内部类的形式影响adapter的复用,解决方案为:将holder抽出,单独封装为一个holder基类。
onBindViewHoler()中的操作是自定义操作,实现逻辑不应该放在封装的adapter中,应该下放到子类adapter中,解决方案为:定义一个抽象方法,让子类继承实现。
封装封装的adapter(主要是增强代码的复用)1234567891011121314151617181920212223242526272829303132333435363738public abstract class BaseAdp&T& extends RecyclerView.Adapter&BaseHolder& {
int layoutId;
public BaseAdp(Context context, List&T& data, int layoutId) {
this.context =
this.data =
this.layoutId = layoutId;
public void setData(List&T& data) {
this.data =
public List&T& getData() {
return this.
public int getItemCount() {
return data == null ? 0 : data.size();
public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return BaseHolder.getHolder(context, parent, layoutId);
public void onBindViewHolder(BaseHolder holder, int position) {
onBind(holder, data.get(position), position);
public abstract void onBind(BaseHolder holder, T t, int position);}
封装的holder基类(主要是增强对Item的控制)向外层暴露getView()、setOnclickListener()两个方法,使外层得到控制Item内部控件的能力。12345678910111213141516171819202122232425262728public class BaseHolder extends RecyclerView.ViewHolder {
View itemV
SparseArray&View&
public BaseHolder(View itemView){
super(itemView);
this.itemView = itemV
views = new SparseArray&View&();
public static &T extends BaseHolder& T getHolder(Context cxt, ViewGroup parent, int layoutId){
return (T) new BaseHolder(LayoutInflater.from(cxt).inflate(layoutId, parent, false));
public &T extends View& T getView(int viewId){
View childreView = views.get(viewId);
if (childreView == null){
childreView = itemView.findViewById(viewId);
views.put(viewId, childreView);
return (T) childreV
public BaseHolder setOnClickListener(int viewId, View.OnClickListener listener){
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}}
封装后的adapter使用使用时让自己的adapter继承封装好的BaseAdapter,只需要实现构造函数和onBind()两个函数即可,大大降低了重复代码,同时借助封装的BaseHolder获得了控制Item内部控件和向其指定事件监听的能力。12345678910111213141516171819public class MyAdapter extends BaseAdapter&Contact&{
public MyAdapter(Context context, List&Contact& data, int layoutId) {
super(context, data, layoutId);
public void onBind(BaseHolder holder, final Contact contact, int position) {
TextView tvName = holder.getView(R.id.tvName);
tvName.setText(contact.getName());
holder.setOnClickListener(R.id.ivPhone, new View.OnClickListener() {
public void onClick(View v) {
}}
坚持原创技术分享,您的支持将鼓励我继续创作!
支付宝打赏I read posts about custom adapters and how to index them but it seems i cannot make mine work. I overwrite the getView and my XML contains 1 TextView and 2 Buttons. I made it that both buttons were detected by the onClickListener however i couldnt differentiate which ListView element was the one who triggered the ClickEvent. I tried i different approach but i always get a NullPointerException in the onClick Method.
public View getView(int position, View convertView, ViewGroup parent){
if(convertView == null){
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listexample, null);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.commandLine_text);
holder.start = (Button) convertView.findViewById(R.id.test_start_button);
holder.stop = (Button) convertView.findViewById(R.id.test_stop_button);
convertView.setTag(holder);
convertView.findViewById(R.id.commandLine_text);
convertView.findViewById(R.id.test_start_button);
convertView.findViewById(R.id.test_stop_button);
holder = (ViewHolder) convertView.getTag();
holder.textView.setText(this.getItem(position));
holder.start.setOnClickListener(this);
holder.stop.setOnClickListener(this);
return convertV
public void onClick(View v) {
//Here i want to know which button of the two (start,stop) was clicked and what position
int position =(Integer)v.getTag();
Log.d("OnClick","Position: "+position);
static class ViewHolder {
TextView textV
解决方案 Try using
to find the position that correlates to the button that was pressed.
本文地址: &
我也读到了自定义适配器,以及如何对其进行索引帖,但似乎我不能让我的工作。我覆盖getView和我的XML包含TextView的1和2按钮。我做了,通过的onClickListener检测两个按钮但是我不能区分其中的ListView元素是谁引发了ClickEvent之一。我想我不同的方法,但我总是在onclick方法一个NullPointerException异常。
@覆盖公共查看getView(INT位置,查看convertView,父母的ViewGroup){
ViewHolder持有人;
如果(convertView == NULL){
LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listexample,NULL);
持有人=新ViewHolder();
holder.textView =(TextView中)convertView.findViewById(R.id.commandLine_text);
holder.start =(按钮)convertView.findViewById(R.id.test_start_button);
holder.stop =(按钮)convertView.findViewById(R.id.test_stop_button);
convertView.setTag(保持器);
convertView.findViewById(R.id.commandLine_text);
convertView.findViewById(R.id.test_start_button);
convertView.findViewById(R.id.test_stop_button);
支架=(ViewHolder)convertView.getTag();
holder.textView.setText(this.getItem(位置));
holder.start.setOnClickListener(本);
holder.stop.setOnClickListener(本);
返回convertV}@覆盖公共无效的onClick(视图v){ //在这里,我想知道这两个按钮(启动,停止)被点击,什么位置
INT位置=(整数)v.getTag();
Log.d(“onclick”事件,“位置:”+位置);}静态类ViewHolder {
TextView中的TextV
按钮停止;} 解决方案 尝试使用
getPositionForView(V) 找到关联到这是pressed按钮的位置。
本文地址: &
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注
与百万开发者在一起
(window.slotbydup = window.slotbydup || []).push({
id: '5828425',
container: s,
size: '300,250',
display: 'inlay-fix'
抠图+修图+调色+合成+特效Photoshop核心
新媒体营销运营实战208招:微信公众号运营

我要回帖

更多关于 setadapter 的文章

 

随机推荐