下面code运行在一个单独的项目来实现自定义列表视图。
公共类MainActivity扩展ListActivity实现OnTouchListener {私人MyCustomAdapter mAdapter;活动TEMP =这一点;的String [] S =新的String [500];ArrayList的< GS> Q =新的ArrayList< GS>();LV的ListView;诠释计数= 0;@覆盖公共无效的onCreate(捆绑savedInstanceState){ super.onCreate(savedInstanceState); DBAdapter分贝= DBAdapter.getDBAdapter(getApplicationContext()); 如果(!db.checkDatabase()) { db.createDatabase(getApplicationContext()); } db.openDatabase(); Q = db.getData(); mAdapter =新MyCustomAdapter();mAdapter.addSeparatorItem(新ContentWrapper(q.get(0).getA_name(),NULL));mAdapter.addItem(新ContentWrapper(q.get(0).getAS_name(),q.get(0).getDesc_art()));的for(int i = 1; I< 460;我++){ 如果(!(q.get(ⅰ).getA_name()。修剪()。等于(q.get(I-1).getA_name()。修剪()))){ mAdapter.addSeparatorItem(新ContentWrapper(q.get(I).getA_name(),NULL)); } mAdapter.addItem(新ContentWrapper(q.get(ⅰ).getAS_name(),q.get(ⅰ).getDesc_art())); } setListAdapter(mAdapter);}//适配器类别私有类MyCustomAdapter延伸BaseAdapter { 私有静态最终诠释TYPE_ITEM = 0; 私有静态最终诠释TYPE_SEPARATOR = 1; 私有静态最终诠释TYPE_MAX_COUNT = TYPE_SEPARATOR + 1; 私人的ArrayList< ContentWrapper> MDATA =新的ArrayList< ContentWrapper>(); 私人LayoutInflater mInflater; 私人TreeSet中<整数GT; mSeparatorsSet =新TreeSet的<整数GT;(); 公共MyCustomAdapter(){ mInflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); } 公共无效的addItem(ContentWrapper值){ mData.add(值); notifyDataSetChanged(); } 公共无效addSeparatorItem(ContentWrapper值){ mData.add(值); //保存分离位置 mSeparatorsSet.add(mData.size() - 1); notifyDataSetChanged(); } 公共ContentWrapper的getItem(INT位置){ 返回mData.get(位置); } @覆盖 公众诠释getItemViewType(INT位置){ 返回mSeparatorsSet.contains(位置)? TYPE_SEPARATOR:TYPE_ITEM; } @覆盖 公众诠释getViewTypeCount(){ 返回TYPE_MAX_COUNT; } 公众诠释的getCount(){ 返回mData.size(); } 众长getItemId(INT位置){ Log.v(getItemId位置,+位置); 返回的位置; } 公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){ ViewHolder支架=无效; 整型= getItemViewType(位置); 如果(convertView == NULL){ 持有人=新ViewHolder(); 开关(类型){ 案例TYPE_ITEM: convertView = mInflater.inflate(R.layout.activity_main1,NULL); holder.textView =(TextView中)convertView.findViewById(R.id.text); 打破; 案例TYPE_SEPARATOR: convertView = mInflater.inflate(R.layout.activity_main2,NULL); holder.textView =(TextView中)convertView.findViewById(R.id.textSeparator); 算上++; 打破; } convertView.setTag(保持器); }其他{ 支架=(ViewHolder)convertView.getTag(); } holder.textView.setText(mData.get(位置).getItem()); 如果(类型== TYPE_ITEM){ holder.textView.setOnClickListener(新View.OnClickListener(){ @覆盖 公共无效的onClick(视图v){ AlertDialog.Builder X =新AlertDialog.Builder(临时); Log.v(位置,+位置); x.setIcon(R.drawable.ic_launcher) // .setTitle(q.get(位置数).getAS_name()) .setTitle(mData.get(位置).getItem()) // .setMessage(q.get(位置数).getDesc_art()) .setMessage(mData.get(位置).getItemDescription()) .setCancelable(真) .setPositiveButton(OK, 新DialogInterface.OnClickListener(){ @覆盖 公共无效的onClick(DialogInterface阿根廷, INT ARG1){ } }); AlertDialog一个= x.create(); 一场表演(); } }); }其他{ holder.textView.setOnClickListener(NULL); } 返回convertView;}}公共静态类ViewHolder { 公众的TextView的TextView;}公共布尔onTouch(视图V,MotionEvent事件){// TODO自动生成方法存根返回false;}}
现在我希望它在我的应用程序的与片段运行相同。我只知道,使用片段=新ContentsFragment();
启动它片段。是否应该延长 ListFragment
有一个默认的构造和放大器;一个 onCreateView(...)
我已经抬高了另一个活动
我是新来的片段放;我不知道应该在code可以改变什么东西。
请帮帮忙!
修改
我显示的是我曾尝试与放我执行code;我收到这是在code指定了4个错误:
公共类ContentsFragment扩展片段实现OnTouchListener {私人MyCustomAdapter mAdapter;活动TEMP =这一点; //错误:类型不匹配:不能从ContentsFragment转换到活动的String [] S =新的String [500];ArrayList的< GS> Q =新的ArrayList< GS>();LV的ListView;诠释计数= 0;@覆盖公共无效的onCreate(捆绑savedInstanceState){super.onCreate(savedInstanceState);DBAdapter DB = DBAdapter.getDBAdapter(getApplicationContext()); //错误:方法getApplicationContext()是未定义的类型ContentsFragment如果(!db.checkDatabase()){ db.createDatabase(getApplicationContext()); //错误:方法getApplicationContext()是未定义的类型ContentsFragment}db.openDatabase();Q = db.getData();mAdapter =新MyCustomAdapter();mAdapter.addSeparatorItem(新ContentWrapper(q.get(0).getA_name(),NULL));mAdapter.addItem(新ContentWrapper(q.get(0).getAS_name(),q.get(0).getDesc_art()));的for(int i = 1; I< 460;我++){如果(!(q.get(ⅰ).getA_name()。修剪()。等于(q.get(I-1).getA_name()。修剪()))){ mAdapter.addSeparatorItem(新ContentWrapper(q.get(I).getA_name(),NULL));}mAdapter.addItem(新ContentWrapper(q.get(ⅰ).getAS_name(),q.get(ⅰ).getDesc_art()));}setListAdapter(mAdapter); //错误:方法getApplicationContext()是未定义的类型ContentsFragment}//适配器类别私有类MyCustomAdapter延伸BaseAdapter {私有静态最终诠释TYPE_ITEM = 0;私有静态最终诠释TYPE_SEPARATOR = 1;私有静态最终诠释TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;私人的ArrayList< ContentWrapper> MDATA =新的ArrayList< ContentWrapper>();私人LayoutInflater mInflater;私人TreeSet中<整数GT; mSeparatorsSet =新TreeSet的<整数GT;();公共MyCustomAdapter(){ mInflater =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);}公共无效的addItem(ContentWrapper值){ mData.add(值); notifyDataSetChanged();}公共无效addSeparatorItem(ContentWrapper值){ mData.add(值); //保存分离位置 mSeparatorsSet.add(mData.size() - 1); notifyDataSetChanged();}公共ContentWrapper的getItem(INT位置){ 返回mData.get(位置);}@覆盖公众诠释getItemViewType(INT位置){ 返回mSeparatorsSet.contains(位置)? TYPE_SEPARATOR:TYPE_ITEM;}@覆盖公众诠释getViewTypeCount(){ 返回TYPE_MAX_COUNT;}公众诠释的getCount(){ 返回mData.size();}众长getItemId(INT位置){ Log.v(getItemId位置,+位置); 返回的位置;}公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){ ViewHolder支架=无效; 整型= getItemViewType(位置); 如果(convertView == NULL){ 持有人=新ViewHolder(); 开关(类型){ 案例TYPE_ITEM: convertView = mInflater.inflate(R.layout.activity_main1,NULL); holder.textView =(TextView中)convertView.findViewById(R.id.text); 打破; 案例TYPE_SEPARATOR: convertView = mInflater.inflate(R.layout.activity_main2,NULL); holder.textView =(TextView中)convertView.findViewById(R.id.textSeparator); 算上++; 打破; } convertView.setTag(保持器); }其他{ 支架=(ViewHolder)convertView.getTag(); } holder.textView.setText(mData.get(位置).getItem()); 如果(类型== TYPE_ITEM){ holder.textView.setOnClickListener(新View.OnClickListener(){ @覆盖 公共无效的onClick(视图v){ AlertDialog.Builder X =新AlertDialog.Builder(临时); Log.v(位置,+位置); x.setIcon(R.drawable.ic_launcher) // .setTitle(q.get(位置数).getAS_name()) .setTitle(mData.get(位置).getItem()) // .setMessage(q.get(位置数).getDesc_art()) .setMessage(mData.get(位置).getItemDescription()) .setCancelable(真) .setPositiveButton(OK, 新DialogInterface.OnClickListener(){ @覆盖 公共无效的onClick(DialogInterface阿根廷, INT ARG1){ } }); AlertDialog一个= x.create(); 一场表演(); } }); }其他{ holder.textView.setOnClickListener(NULL); }返回convertView;}}公共静态类ViewHolder {公众的TextView的TextView;}公共布尔onTouch(视图V,MotionEvent事件){// TODO自动生成方法存根返回false;}}
解决方案
setListAdapter
是 ListFragment
的方法。所以,你需要扩展 ListFragment
使用相同的。
更改此
mAdapter =新MyCustomAdapter();
到
mAdapter =新MyCustomAdapter(getActivity());
然后
公共MyCustomAdapter(上下文的背景下){mInflater = LayoutInflater.from(上下文);}
The below code is running the custom listview implemented in a seperate project.
public class MainActivity extends ListActivity implements OnTouchListener{
private MyCustomAdapter mAdapter;
Activity temp = this;
String []s = new String[500];
ArrayList<GS> q = new ArrayList<GS>();
ListView lv;
int count=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DBAdapter db = DBAdapter.getDBAdapter(getApplicationContext());
if (!db.checkDatabase())
{
db.createDatabase(getApplicationContext());
}
db.openDatabase();
q = db.getData();
mAdapter = new MyCustomAdapter();
mAdapter.addSeparatorItem(new ContentWrapper(q.get(0).getA_name(),null));
mAdapter.addItem(new ContentWrapper(q.get(0).getAS_name(), q.get(0).getDesc_art()));
for (int i = 1; i < 460; i++) {
if (!(q.get(i).getA_name().trim().equals(q.get(i-1).getA_name().trim()))) {
mAdapter.addSeparatorItem(new ContentWrapper(q.get(i).getA_name(), null));
}
mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art()));
}
setListAdapter(mAdapter);
}
//Adapter Class
private class MyCustomAdapter extends BaseAdapter {
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
private ArrayList<ContentWrapper> mData = new ArrayList<ContentWrapper>();
private LayoutInflater mInflater;
private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();
public MyCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(ContentWrapper value) {
mData.add(value);
notifyDataSetChanged();
}
public void addSeparatorItem(ContentWrapper value) {
mData.add(value);
// save separator position
mSeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
public ContentWrapper getItem(int position) {
return mData.get(position);
}
@Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
public int getCount() {
return mData.size();
}
public long getItemId(int position) {
Log.v("getItemId Position", ""+position);
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
convertView = mInflater.inflate(R.layout.activity_main1, null);
holder.textView = (TextView)convertView.findViewById(R.id.text);
break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.activity_main2, null);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
count++;
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
} holder.textView.setText(mData.get(position).getItem());
if (type == TYPE_ITEM) {
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder x = new AlertDialog.Builder(temp);
Log.v("position",""+position);
x.setIcon(R.drawable.ic_launcher)
// .setTitle(q.get(position-count).getAS_name())
.setTitle(mData.get(position).getItem())
// .setMessage(q.get(position-count).getDesc_art())
.setMessage(mData.get(position).getItemDescription())
.setCancelable(true)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg,
int arg1) {
}
});
AlertDialog a = x.create();
a.show();
}
});
} else {
holder.textView.setOnClickListener(null);
}
return convertView;
}
}
public static class ViewHolder {
public TextView textView;
}
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
}
Now I want it to be running the same in my App with Fragment.
I just know that using fragment = new ContentsFragment();
initiates it in fragment.
should it be extending ListFragment
with a default constructor & an onCreateView(...)
which I have inflated the another activities
I am new to fragments & i don't know what things should be changed in the code.
Please help !
EDIT:
I am showing my implemented code of what i have tried & i am getting 4 errors which are have specified in the code:
public class ContentsFragment extends Fragment implements OnTouchListener{
private MyCustomAdapter mAdapter;
Activity temp = this;// error: Type mismatch: cannot convert from ContentsFragment to Activity
String []s = new String[500];
ArrayList<GS> q = new ArrayList<GS>();
ListView lv;
int count=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DBAdapter db = DBAdapter.getDBAdapter(getApplicationContext());//error :The method getApplicationContext() is undefined for the type ContentsFragment
if (!db.checkDatabase())
{
db.createDatabase(getApplicationContext());//error : The method getApplicationContext() is undefined for the type ContentsFragment
}
db.openDatabase();
q = db.getData();
mAdapter = new MyCustomAdapter();
mAdapter.addSeparatorItem(new ContentWrapper(q.get(0).getA_name(),null));
mAdapter.addItem(new ContentWrapper(q.get(0).getAS_name(), q.get(0).getDesc_art()));
for (int i = 1; i < 460; i++) {
if (!(q.get(i).getA_name().trim().equals(q.get(i-1).getA_name().trim()))) {
mAdapter.addSeparatorItem(new ContentWrapper(q.get(i).getA_name(), null));
}
mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art()));
}
setListAdapter(mAdapter); //error : The method getApplicationContext() is undefined for the type ContentsFragment
}
//Adapter Class
private class MyCustomAdapter extends BaseAdapter {
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
private ArrayList<ContentWrapper> mData = new ArrayList<ContentWrapper>();
private LayoutInflater mInflater;
private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();
public MyCustomAdapter() {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(ContentWrapper value) {
mData.add(value);
notifyDataSetChanged();
}
public void addSeparatorItem(ContentWrapper value) {
mData.add(value);
// save separator position
mSeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
public ContentWrapper getItem(int position) {
return mData.get(position);
}
@Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
public int getCount() {
return mData.size();
}
public long getItemId(int position) {
Log.v("getItemId Position", ""+position);
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
convertView = mInflater.inflate(R.layout.activity_main1, null);
holder.textView = (TextView)convertView.findViewById(R.id.text);
break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.activity_main2, null);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
count++;
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
} holder.textView.setText(mData.get(position).getItem());
if (type == TYPE_ITEM) {
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder x = new AlertDialog.Builder(temp);
Log.v("position",""+position);
x.setIcon(R.drawable.ic_launcher)
// .setTitle(q.get(position-count).getAS_name())
.setTitle(mData.get(position).getItem())
// .setMessage(q.get(position-count).getDesc_art())
.setMessage(mData.get(position).getItemDescription())
.setCancelable(true)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg,
int arg1) {
}
});
AlertDialog a = x.create();
a.show();
}
});
} else {
holder.textView.setOnClickListener(null);
}
return convertView;
}
}
public static class ViewHolder {
public TextView textView;
}
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
}
解决方案
setListAdapter
is a method of ListFragment
. So you need to extend ListFragment
to use the same.
Change this
mAdapter = new MyCustomAdapter();
to
mAdapter = new MyCustomAdapter(getActivity());
And Then
public MyCustomAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}