如何在Android ViewPager现有代码中添加显示另一个TextView?
如何在ViewPager页面中显示多个TextView?
我正在使用ViewPager,当前仅能显示一个TextView,希望添加并显示另一个TextView。恳请帮忙,提前感谢。
你提供的现有代码:
MainActivity类
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set title for the GridView setTitle("GridView"); // Get the view from grid_view.xml setContentView(R.layout.grid_view); // Set the images from ImageAdapter.java to GridView GridView gridview = (GridView) findViewById(R.id.gridview); //gridview.setAdapter(new ImageAdapter(this)); //commented line 05052018 gridview.setAdapter(new ChangesofAdapter(this)); //new line 05052018 // Listening to GridView item click gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { // Launch ImageViewPager.java on selecting GridView Item Intent i = new Intent(getApplicationContext(), ImageViewPager.class); // Show a simple toast message for the item position Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show(); // Send the click position to ImageViewPager.java using intent i.putExtra("id", position); // Start ImageViewPager startActivity(i); } }); } }
ChangesofAdapter类
public class ChangesofAdapter extends BaseAdapter { private Context mContext; public ChangesofAdapter(Context c) { mContext = c; } public int getCount() { return getDataContacts().length; } public Object getItem(int position) { return getDataContacts()[position]; } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { TextView imageView; if (convertView == null) { // If it's not recycled, initialize some attributes imageView = new TextView(mContext.getApplicationContext()); imageView.setTextColor(Color.GREEN); imageView.setGravity(Gravity.LEFT); // new line 05052018 imageView.setTextSize(30); } else { imageView = (TextView) convertView; } String abc =getDataContacts()[position]; imageView.setText(abc); // new line 05052018 return imageView; } public String[] getContacts(){ DBUtils utils = new DBUtils(mContext.getApplicationContext()); ArrayList<String> names = new ArrayList<String>(); new DBUtils((mContext.getApplicationContext())); try { DBUtils.createDatabase(); } catch (IOException e) { Log.w(" Create Db "+e.toString(),"==="); } DBUtils.openDatabase(); Cursor cursor = utils.getResult("select * from Cflviewpagerdata order by title"); cursor.moveToFirst(); while(!cursor.isAfterLast()) { names.add(cursor.getString(cursor.getColumnIndex("view"))); cursor.moveToNext(); } cursor.close(); DBUtils.closeDataBase(); return names.toArray(new String[names.size()]); } public String[] getDataContacts(){ DBUtils utils = new DBUtils(mContext.getApplicationContext()); ArrayList<String> names = new ArrayList<String>(); new DBUtils((mContext.getApplicationContext())); try { DBUtils.createDatabase(); } catch (IOException e) { Log.w(" Create Db "+e.toString(),"==="); } DBUtils.openDatabase(); Cursor cursor = utils.getResult("select * from Cflviewpagerdata order by title"); cursor.moveToFirst(); while(!cursor.isAfterLast()) { names.add(cursor.getString(cursor.getColumnIndex("title"))); cursor.moveToNext(); } cursor.close(); DBUtils.closeDataBase(); return names.toArray(new String[names.size()]); } }
ImageViewPager类(片段)
public class ImageViewPager extends Activity implements OnInitListener { // Declare Variable int position; Bundle img = new Bundle(); ViewPager vp; private TextToSpeech mTts; List<TextView> images; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set title for the ViewPager setTitle("ViewPager"); // Get the view from view_pager.xml setContentView(R.layout.view_pager); mTts = new TextToSpeech(this, this); // Retrieve data from MainActivity on item click event Intent p = getIntent(); position = p.getExtras().getInt("id"); ChangesofAdapter imageAdapter = new ChangesofAdapter(this); //new line 05052018 images = new ArrayList<TextView>(); //new line 05052018 // Retrieve all the images for (int i = 0; i < imageAdapter.getCount(); i++) { TextView imageView = new TextView(this); //new line 05052018 String abc = imageAdapter.getContacts()[i]; imageView.setText(imageAdapter.getContacts()[i]); //new line 05052018 imageView.setTextColor(Color.BLUE); imageView.setGravity(Gravity.CENTER_HORIZONTAL);//new line 05052018 img.putString("CURRENT_POSITION", abc); images.add(imageView); } vp=(ViewPager)fin
解决方案:通过自定义布局和PagerAdapter实现多TextView显示
原来的代码中,每个ViewPager页面只创建了单个TextView,所以只能显示一个内容。我们可以通过以下步骤实现多TextView展示:
1. 创建包含两个TextView的页面布局
在res/layout目录下新建item_viewpager.xml,作为ViewPager每个页面的模板:
<?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" android:padding="16dp"> <!-- 第一个TextView:显示标题 --> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="30sp" android:textColor="#0000FF" android:gravity="center_horizontal"/> <!-- 第二个TextView:显示内容 --> <TextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#008000" android:layout_marginTop="16dp"/> </LinearLayout>
2. 自定义ViewPager的适配器
创建MyPagerAdapter类,负责加载布局并绑定数据:
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.viewpager.widget.PagerAdapter; import java.util.List; public class MyPagerAdapter extends PagerAdapter { private Context mContext; private List<String> mTitleList; // 标题数据 private List<String> mContentList; // 内容数据 public MyPagerAdapter(Context context, List<String> titleList, List<String> contentList) { mContext = context; mTitleList = titleList; mContentList = contentList; } @Override public int getCount() { return mTitleList.size(); // 返回页面总数 } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { // 加载布局文件 LayoutInflater inflater = LayoutInflater.from(mContext); View pageView = inflater.inflate(R.layout.item_viewpager, container, false); // 获取两个TextView并设置对应数据 TextView tvTitle = pageView.findViewById(R.id.tv_title); TextView tvContent = pageView.findViewById(R.id.tv_content); tvTitle.setText(mTitleList.get(position)); tvContent.setText(mContentList.get(position)); // 将页面添加到ViewPager容器 container.addView(pageView); return pageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { // 移除页面,避免内存泄漏 container.removeView((View) object); } }
3. 修改ImageViewPager类的代码
替换原来的TextView列表逻辑,改用自定义适配器:
import android.content.Intent; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.widget.ViewPager; import androidx.appcompat.app.AppCompatActivity; import java.util.Arrays; import java.util.List; public class ImageViewPager extends AppCompatActivity implements TextToSpeech.OnInitListener { int position; ViewPager vp; private TextToSpeech mTts; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTitle("ViewPager"); setContentView(R.layout.view_pager); mTts = new TextToSpeech(this, this); // 获取从MainActivity传递过来的位置 Intent p = getIntent(); position = p.getExtras().getInt("id"); // 获取数据 ChangesofAdapter dataAdapter = new ChangesofAdapter(this); List<String> titleList = Arrays.asList(dataAdapter.getDataContacts()); List<String> contentList = Arrays.asList(dataAdapter.getContacts()); // 初始化ViewPager并设置适配器 vp = findViewById(R.id.viewpager); // 确保你的view_pager.xml里有这个id MyPagerAdapter pagerAdapter = new MyPagerAdapter(this, titleList, contentList); vp.setAdapter(pagerAdapter); // 设置默认显示选中的页面 vp.setCurrentItem(position); } @Override public void onInit(int status) { // 保留你原来的TTS初始化逻辑 } @Override protected void onDestroy() { // 释放TTS资源 if (mTts != null) { mTts.stop(); mTts.shutdown(); } super.onDestroy(); } }
4. 优化ChangesofAdapter(可选)
把返回数组的方法改成返回List,减少代码冗余:
import android.content.Context; import android.database.Cursor; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class ChangesofAdapter extends BaseAdapter { private Context mContext; public ChangesofAdapter(Context c) { mContext = c; } @Override public int getCount() { return getDataContactsList().size(); } @Override public Object getItem(int position) { return getDataContactsList().get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView textView; if (convertView == null) { textView = new TextView(mContext); textView.setTextColor(android.graphics.Color.GREEN); textView.setGravity(android.view.Gravity.LEFT); textView.setTextSize(30); } else { textView = (TextView) convertView; } textView.setText(getDataContactsList().get(position)); return textView; } public List<String> getContactsList(){ DBUtils utils = new DBUtils(mContext); ArrayList<String> names = new ArrayList<>(); try { DBUtils.createDatabase(); } catch (IOException e) { Log.w("Create Db", e.toString()); } DBUtils.openDatabase(); Cursor cursor = utils.getResult("select * from Cflviewpagerdata order by title"); if (cursor.moveToFirst()) { do { names.add(cursor.getString(cursor.getColumnIndex("view"))); } while (cursor.moveToNext()); } cursor.close(); DBUtils.closeDataBase(); return names; } public List<String> getDataContactsList(){ DBUtils utils = new DBUtils(mContext); ArrayList<String> names = new ArrayList<>(); try { DBUtils.createDatabase(); } catch (IOException e) { Log.w("Create Db", e.toString()); } DBUtils.openDatabase(); Cursor cursor = utils.getResult("select * from Cflviewpagerdata order by title"); if (cursor.moveToFirst()) { do { names.add(cursor.getString(cursor.getColumnIndex("title"))); } while (cursor.moveToNext()); } cursor.close(); DBUtils.closeDataBase(); return names; } // 保留原来的数组方法,兼容旧代码(如果需要的话) public String[] getContacts(){ return getContactsList().toArray(new String[0]); } public String[] getDataContacts(){ return getDataContactsList().toArray(new String[0]); } }
这样修改后,ViewPager的每个页面都会显示两个TextView,分别展示你的title和view字段的数据啦!
内容的提问来源于stack exchange,提问作者user2454588
相关产品推荐
相关产品推荐

