`

android 可点击的listView项

阅读更多
package com.o1.android.view;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

/**
* This list adapter is derived from the "Efficient List Adapter"-Example of
* API-Demos. It uses holder object to access the list items efficiently.
* Additionally, click listeners are provided, which can be connected to the
* arbitrary view items, e.g. customized checkboxes, or other clickable
* Image/TextViews. Implement subclasses of them and add your listeners to your
* "clickable" views.
*
* @author poss3x
*/
public abstract class ClickableListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List mDataObjects; // our generic object list
private int mViewId;

/**
* This is the holder will provide fast access to arbitrary objects and
* views. Use a subclass to adapt it for your personal needs.
*/
public static class ViewHolder {
// back reference to our list object
public Object data;
}

/**
* The click listener base class.
*/
public static abstract class OnClickListener implements
View.OnClickListener {

private ViewHolder mViewHolder;

/**
* @param holder The holder of the clickable item
*/
public OnClickListener(ViewHolder holder) {
mViewHolder = holder;
}

// delegates the click event
public void onClick(View v) {
onClick(v, mViewHolder);
}

/**
* Implement your click behavior here
* @param v The clicked view.
*/
public abstract void onClick(View v, ViewHolder viewHolder);
};

/**
* The long click listener base class.
*/
public static abstract class OnLongClickListener implements
View.OnLongClickListener {
private ViewHolder mViewHolder;

/**
* @param holder The holder of the clickable item
*/
public OnLongClickListener(ViewHolder holder) {
mViewHolder = holder;
}

// delegates the click event
public boolean onLongClick(View v) {
onLongClick(v, mViewHolder);
return true;
}

/**
* Implement your click behavior here
* @param v The clicked view.
*/
public abstract void onLongClick(View v, ViewHolder viewHolder);

};

/**
* @param context The current context
* @param viewid The resource id of your list view item
* @param objects The object list, or null, if you like to indicate an empty
* list
*/
public ClickableListAdapter(Context context, int viewid, List objects) {

// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
mDataObjects = objects;
mViewId = viewid;

if (objects == null) {
mDataObjects = new ArrayList<Object>();
}
}

/**
* The number of objects in the list.
*/
public int getCount() {
return mDataObjects.size();
}

/**
* @return We simply return the object at position of our object list Note,
* the holder object uses a back reference to its related data
* object. So, the user usually should use {@link ViewHolder#data}
* for faster access.
*/
public Object getItem(int position) {
return mDataObjects.get(position);
}

/**
* We use the array index as a unique id. That is, position equals id.
*
* @return The id of the object
*/
public long getItemId(int position) {
return position;
}

/**
* Make a view to hold each row. This method is instantiated for each list
* object. Using the Holder Pattern, avoids the unnecessary
* findViewById()-calls.
*/
public View getView(int position, View view, ViewGroup parent) {
// A ViewHolder keeps references to children views to avoid uneccessary
// calls
// to findViewById() on each row.
ViewHolder holder;

// When view is not null, we can reuse it directly, there is no need
// to reinflate it. We only inflate a new View when the view supplied
// by ListView is null.
if (view == null) {

view = mInflater.inflate(mViewId, null);
// call the user's implementation
holder = createHolder(view);
// we set the holder as tag
view.setTag(holder);

} else {
// get holder back...much faster than inflate
holder = (ViewHolder) view.getTag();
}

// we must update the object's reference
holder.data = getItem(position);
// call the user's implementation
bindHolder(holder);

return view;
}

/**
* Creates your custom holder, that carries reference for e.g. ImageView
* and/or TextView. If necessary connect your clickable View object with the
* PrivateOnClickListener, or PrivateOnLongClickListener
*
* @param vThe view for the new holder object
*/
protected abstract ViewHolder createHolder(View v);

/**
* Binds the data from user's object to the holder
* @param h The holder that shall represent the data object.
*/
protected abstract void bindHolder(ViewHolder h);
}


// -------------------------------------------------------------
// E X A M P L E
// -------------------------------------------------------------

// LAYOUT FILE

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
>

<TextView android:text="Text" android:id="@+id/listitem_text"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
></TextView>
<ImageView android:id="@+id/listitem_icon"
android:src="@drawable/globe2_32x32"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="32px"
android:maxHeight="32px"
>
</ImageView>
</LinearLayout>



//--------------------------------------------------------------
// ACTIVITY
//--------------------------------------------------------------
package com.o1.android.view;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.o1.android.view.ClickableListAdapter;
import com.o1.android.view.ClickableListAdapter.ViewHolder;

/**
* An example how to implement the ClickableListAdapter for a list view layout containing
* a TextView and an ImageView.
* @author poss3x
*/
public class ClickableListItemActivity extends ListActivity {

/**
* Our data class. This data will be bound to
* MyViewHolder, which in turn is used for the
* ListView.
*/
static class MyData {
public MyData(String t, boolean e) {
text = t;
enable = e;
}

String text;
boolean enable;
}

/**
* Our very own holder referencing the view elements
* of our ListView layout
*/
static class MyViewHolder extends ViewHolder {

public MyViewHolder(TextView t, ImageView i) {
text = t;
icon = i;
}
TextView text;
ImageView icon;
}

/**
* The implementation of ClickableListAdapter
*/
private class MyClickableListAdapter extends ClickableListAdapter {
public MyClickableListAdapter(Context context, int viewid,
List<MyData> objects) {
super(context, viewid, objects);
// nothing to do
}

protected void bindHolder(ViewHolder h) {
// Binding the holder keeps our data up to date.
// In contrast to createHolder this method is called for all items
// So, be aware when doing a lot of heavy stuff here.
// we simply transfer our object's data to the list item representatives
MyViewHolder mvh = (MyViewHolder) h;
MyData mo = (MyData)mvh.data;
mvh.icon.setImageBitmap(
mo.enable ? ClickableListItemActivity.this.mIconEnabled
: ClickableListItemActivity.this.mIconDisabled);
mvh.text.setText(mo.text);

}

@Override
protected ViewHolder createHolder(View v) {
// createHolder will be called only as long, as the ListView is not filled
// entirely. That is, where we gain our performance:
// We use the relatively costly findViewById() methods and
// bind the view's reference to the holder objects.
TextView text = (TextView) v.findViewById(R.id.listitem_text);
ImageView icon = (ImageView) v.findViewById(R.id.listitem_icon);
ViewHolder mvh = new MyViewHolder(text, icon);

// Additionally, we make some icons clickable
// Mind, that item becomes clickable, when adding a click listener (see API)
// so, it is not necessary to use the android:clickable attribute in XML
icon.setOnClickListener(new ClickableListAdapter.OnClickListener(mvh) {

public void onClick(View v, ViewHolder viewHolder) {
// we toggle the enabled state and also switch the icon
MyViewHolder mvh = (MyViewHolder) viewHolder;
MyData mo = (MyData) mvh.data;
mo.enable = !mo.enable; // toggle
ImageView icon = (ImageView) v;
icon.setImageBitmap(
mo.enable ? ClickableListItemActivity.this.mIconEnabled
: ClickableListItemActivity.this.mIconDisabled);
}
});

// for text we implement a long click listener
text.setOnLongClickListener(new ClickableListAdapter.OnLongClickListener(mvh) {

@Override
public void onLongClick(View v, ViewHolder viewHolder) {

MyViewHolder mvh = (MyViewHolder) viewHolder;
MyData mo = (MyData)mvh.data;

// we toggle an '*' in our text element
String s = mo.text;
if (s.charAt(0) == '*') {
mo.text = s.substring(1);
} else {
mo.text = '*' + s;
}
mvh.text.setText(mo.text);
}

});

return mvh; // finally, we return our new holder
}

}


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// preloading our icons
mIconEnabled = BitmapFactory.decodeResource(this.getResources(),
R.drawable.globe2_32x32);
mIconDisabled = BitmapFactory.decodeResource(this.getResources(),
R.drawable.globe2_32x32_trans);

// fill list with some items...
// to demonstrate the performance we create a bunch of data objects
for (int i = 0; i < 250; ++i) {
mObjectList.add(new MyData("Some Text " + i, true));
}
//here we set our adapter
setListAdapter(new MyClickableListAdapter(this,
R.layout.clickablelistitemview, mObjectList));

}

// --------------- field section -----------------
private Bitmap mIconEnabled;
private Bitmap mIconDisabled;

private List<MyData> mObjectList = new ArrayList<MyData>();

}
分享到:
评论

相关推荐

    android listview 点击listview下面 显示更多

    标题“android listview 点击listview下面 显示更多”表明我们需要探讨如何在ListView的点击事件中实现显示更多的功能。 首先,我们要理解ListView的工作原理。ListView通过复用视图(ViewHolder模式)来提高性能,...

    android listview 列表 点击列表进入详细页面

    至此,你已经掌握了如何在Android中创建一个ListView,监听点击事件,并在点击列表项后跳转到详细页面。记得适配器可以根据需求进行自定义,以满足不同的UI和功能需求。同时,单选模式也可以根据实际应用场景进行...

    android Widget 点击 listview 显示内容

    ListView是Android中用于显示可滚动列表的视图组件,每个列表项可以通过Adapter来填充。常见的Adapter有ArrayAdapter、SimpleAdapter等。在这里,我们需要自定义一个Adapter,以便添加和删除行数据。 5. **自定义...

    Android listview嵌套listview

    - **ListView**: Android提供的可滚动视图,用于显示一系列相同的数据项。 - **Adapter**: ListView的数据源,负责将数据转化为ListView可显示的View。 2. **嵌套ListView的需求** - 当需要在一项数据内展示多级...

    android studio实现listview的增加,左滑删除

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。在本文中,我们将深入探讨如何在Android Studio中实现ListView的动态增加以及左滑删除功能,这将帮助你构建更加用户友好的应用程序。 首先...

    Android之ListView列表视图和界面跳转实现

    当用户点击ListView的某一项时,我们可以通过监听`onItemClick`事件来实现界面跳转。首先,为ListView设置`OnItemClickListener`: ```java listView.setOnItemClickListener(new AdapterView.OnItemClickListener...

    android AppWidget ListView

    4. **处理点击事件**:可以通过`setOnClickPendingIntent()`设置ListView项的点击事件,这需要一个PendingIntent,当用户点击列表项时,该Intent会被触发。 5. **更新AppWidget**:最后,使用`AppWidgetManager`的`...

    Android 点击listview弹出popupwindow弹出框

    接下来,我们要在`ListView`的`OnItemClickListener`中处理点击事件,当用户点击`ListView`的某一项时,弹出`PopupWindow`。同时,为了实现右滑删除功能,我们需要使用`SwipeRefreshLayout`和`AbsListView....

    Android ListView项收缩效果

    "Android ListView项收缩效果"指的是为ListView的每一项添加一种交互式的动画效果,即当用户点击某一项时,该项会进行收缩或展开操作,通常用于实现如折叠菜单、详细信息的隐藏与显示等功能。这种效果不仅提升了用户...

    Android自定义可扩展ListView

    4. **点击监听器**:为ListView的每一项设置点击监听器,当用户点击时,根据数据模型中的状态切换展开/折叠。同时,为了防止点击穿透,可能还需要设置子视图的点击事件。 5. **性能优化**:由于ListView需要频繁地...

    android arraylist 实现 listview

    比如,可以为每个ListView项添加一个"编辑"按钮,点击后弹出一个新的Activity或Dialog进行编辑;"新增"可以在主界面增加一个按钮,点击后跳转至添加新条目的界面;"删除"则可以通过设置长按事件或右侧滑动删除效果来...

    android listview嵌套listview实现折叠列表

    本文将详细介绍如何在Android中使用ListView实现嵌套的可折叠效果。 首先,我们需要了解基本的ListView工作原理。ListView通过Adapter来绑定数据源,Adapter负责将数据转化为ListView可显示的View。在Android中,...

    android dialog嵌套ListView

    以上就是关于“android dialog嵌套ListView”实现的基本步骤,包括创建自定义布局、适配器、设置点击事件以及在`Dialog`中显示`ListView`。通过这种方式,我们可以在`Dialog`中展示丰富的列表数据,并允许用户进行...

    Android ListView长按删除

    综上所述,实现Android ListView的长按删除功能,主要涉及以下几个步骤:设置适配器、添加长按监听器、处理长按事件、删除数据源中的项并更新适配器,以及可选地提供删除确认提示。通过这些步骤,你可以为你的...

    Android中ListView添加头部

    综上所述,添加头部到Android的ListView是一项常见的自定义需求。通过使用HeaderView参数或在Adapter内部处理,我们可以轻松地实现这一功能。同时,理解如何处理滚动事件和触摸事件将使我们的应用更具交互性。在实际...

    Android完美解决listview中多个edittext显示混乱问题

    - 在用户点击EditText时,可以通过设置ListView的OnItemClickListener,使ListView禁止滚动。当用户离开EditText时,再恢复ListView的滚动功能。这种方式限制了用户在输入时的交互体验。 4. **解决方案三:自定义...

    Android 双ListView 联动

    1. ListView概述:ListView是Android系统提供的一个可滚动的视图组件,通常用于展示大量的数据列表,通过适配器(Adapter)将数据源与视图进行绑定。 2. 数据适配器:在双ListView联动中,每个ListView都需要一个...

    在ListView中嵌套Switch开关,点击ListView条目来切换Switch的状态

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。而Switch则是用于切换两种状态(通常为开和关)的控件。将Switch嵌套在ListView中,可以实现用户通过点击列表条目来切换Switch的状态,从而...

    Android中采用ListView实现数据列表显示案例

    5. **监听事件**:可以通过设置OnItemClickListener来监听用户点击列表项的事件,以便执行相应的操作。 6. **自定义列表项视图**:如果需要自定义列表项的显示样式,可以创建一个新的XML布局文件,然后在Adapter的`...

    android布局之listviewDEMO

    首先,ListView是Android SDK提供的一种视图容器,用于显示一列可滚动的项目列表。它可以高效地处理大量的数据,因为只有可见的视图会进行绘制,其他则通过复用机制节省资源。这对于显示大数据集的应用来说,是必不...

Global site tag (gtag.js) - Google Analytics