您的位置:首页 > 移动开发 > Android开发

android linearlayout代替listview实现

2015-08-14 16:25 471 查看
最近在写项目,遇到了一个问题,需要在一个页面中显示两个列表,如图



思路: 在scrollview 中写两个linearlayout , 用linearlayout 代替listview。

下面是如何实现linearlayout 代替Listview。

第一步:重写linearlayout

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;

public class MyLinearLayoutForListView extends LinearLayout {
private LinearLayoutBaseAdapter adapter;
private OnItemClickListener onItemClickListener;

public MyLinearLayoutForListView(Context context) {
super(context);
}

public MyLinearLayoutForListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void setAdapter(LinearLayoutBaseAdapter adapter) {
this.adapter = adapter;
//绑定adapter中的监听
adapter.setNotifyDataSetChangedIF(changedIF);
// setAdapter 时添加 view
bindView();
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;

}

/**
* 初始化刷新监听
*/
public MNotifyDataSetChangedIF changedIF = new MNotifyDataSetChangedIF() {
@Override
public void changed() {
removeAllViews();
bindView();
}
};

/**
* 刷新页面时调用
* @author caipc
*/
public interface MNotifyDataSetChangedIF{
public void changed();
}
/**
* 绑定 adapter 中所有的 view
*/
private void bindView() {
if (adapter == null) {
return;
}

for (int i = 0; i < adapter.getCount(); i++) {
final View v = adapter.getView(i);
final int tmp = i;
final Object obj = adapter.getItem(i);

// view 点击事件触发时回调我们自己的接口
v.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClicked(v, obj, tmp);
}
}
});

addView(v);
}
}

/**
*
* 回调接口
*/
public interface OnItemClickListener {
/**
*
* @param v
*            点击的 view
* @param obj
*            点击的 view 所绑定的对象
* @param position
*            点击位置的 index
*/
public void onItemClicked(View v, Object obj, int position);
}
}


第二步:写一个linearlayout的adapter

package com.example.linearlayouttolistview;

import java.util.List;

import com.example.linearlayouttolistview.MyLinearLayoutForListView.MNotifyDataSetChangedIF;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;

public abstract class LinearLayoutBaseAdapter {
private List<? extends Object> list;
private Context context;
private MNotifyDataSetChangedIF changedIF;
public LinearLayoutBaseAdapter(Context context, List<? extends Object> list) {
this.context = context;
this.list = list;
}

public LayoutInflater getLayoutInflater() {
if (context != null) {
return LayoutInflater.from(context);
}

return null;
}

public int getCount() {
if (list != null) {
return list.size();
}
return 0;
};

public Object getItem(int position) {
if (list != null) {
return list.get(position);
}
return null;
};

/**
* 绑定adapter中的监听
* @param changedIF
*/
public void setNotifyDataSetChangedIF(MNotifyDataSetChangedIF changedIF){
this.changedIF = changedIF;
}
/**
* 数据刷新
*/
public void notifyDataSetChanged(){
if (changedIF != null) {
changedIF.changed();
}
}
/**
* 供子类复写
*
* @param position
* @return
*/
abstract View getView(int position);
}


第三步:在activity中实现

package com.example.linearlayouttolistview;

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

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.example.linearlayouttolistview.MyLinearLayoutForListView.OnItemClickListener;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
final MyAdapter adapter = new MyAdapter(this, list);
final MyLinearLayoutForListView forListView = (MyLinearLayoutForListView) findViewById(R.id.ll_list);
forListView.setAdapter(adapter);

forListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClicked(View v, Object obj, int position) {
if (position == list.size() -1) {
list.add("aaaaaaaaaaa");
adapter.notifyDataSetChanged();
}
}
});

//		final Handler handler = new Handler(){
//			@Override
//			public void handleMessage(Message msg) {
//				super.handleMessage(msg);
//				list.add("aaaaaaaaaaa");
//				list.add("bbbbbbbbbbb");
//				adapter.notifyDataSetChanged();
//			}
//		};
//		new Thread(){
//			public void run() {
//				try {
//					sleep(3000);
//					handler.sendEmptyMessage(1);
//				} catch (Exception e) {
//					// TODO: handle exception
//				}
//			};
//		}.start();
}

private List<String> list;
private void initData(){
list = new ArrayList<String>();
for (int i = 0; i < 50; i++) {
list.add(String.valueOf(i));
}
}

class MyAdapter extends LinearLayoutBaseAdapter{
public MyAdapter(Context context, List<? extends Object> list) {
super(context, list);
}
@Override
View getView(int position) {
View view = getLayoutInflater().inflate(R.layout.item, null);
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText((String) getItem(position));
return view;
}

}

}


相关xml文件

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<com.example.linearlayouttolistview.MyLinearLayoutForListView
android:id="@+id/ll_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>

</RelativeLayout>


item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:padding="10dp">

<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试"
/>

</LinearLayout>

</LinearLayout>


效果图片:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息