【问题标题】:Change text color in fragment listview with adapter on menu item click在菜单项单击上使用适配器更改片段列表视图中的文本颜色
【发布时间】:2018-06-30 01:21:16
【问题描述】:

大家好,在这个应用程序中,需要在菜单项单击时更改文本颜色。 Textview 处于自定义行布局中,由适配器和适配器在两个片段选项卡布局中设置膨胀。在菜单项上,单击需要更改整个列表视图的文本颜色。在正常应用程序中,它工作正常,但在片段上,如果有人可以提供帮助,它会在空对象引用上给出错误“Adaptor.setTextColor(int)'”。谢谢 问题是适配器没有在它在片段中初始化的主要活动中初始化。所以在每个片段中都需要像

public void setColor(int color) 
 adapter.setTextColor(color); 
adapter.notifyDataSetChanged(); }

以及它的主要活动选项菜单

Fragment fragment=new Fragment(); 
fragment.setColor(Color.BLACK); –

MainActivity.java

    private SectionsPagerAdapter mSectionsPagerAdapter;
 private ViewPager mViewPager;
   NewsAdaptor adaptor;

protected void onCreate ( Bundle savedInstanceState ) {
    super.onCreate(savedInstanceState);
    Context mContext = getApplicationContext();
    setContentView(R.layout.activity_main);
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setOffscreenPageLimit(10);
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);

    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
}


  @Override
public boolean onCreateOptionsMenu ( Menu menu ) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@SuppressLint("ResourceType")
@Override
public boolean onOptionsItemSelected ( MenuItem item ) {

    int id = item.getItemId();
    if (id == R.id.chagecolor) {
        Fragment fragment=new Fragment(); 
         fragment.setColor(Color.BLACK); –

    }
    return super.onOptionsItemSelected(item);
}

newsApter.java

public class NewsAdaptor extends BaseAdapter {
TextView tvtitle;
private int color;
Context context;

public NewsAdaptor ( Context context, ArrayList <NewsItem> newsList ) {
    this.context = context;
    this.newsList = newsList;
    this.color = Color.RED;
}

ArrayList<NewsItem> newsList;

@Override
public int getCount () {

    return newsList.size();
}

@Override
public Object getItem ( int position ) {
    return newsList.get(position);
}

@Override
public long getItemId ( int position ) {
    return 0;
}

@Override
public View getView ( int position, View convertView, ViewGroup parent ) {
    if (convertView == null){
        convertView=View.inflate(context, R.layout.newsitemlist_layout,null);
    }
    NewsItem currentNews = newsList.get(position);
    tvtitle = (TextView) convertView.findViewById(R.id.textView1id);
    tvtitle.setText(currentNews.getTitle());
    tvtitle.setTextColor(color);
    return convertView;
}
public void setTextColor(int color) {
    this.color = color;

}

}

现在它在一个片段中实现了 ware 适配器

贸易.java

public class TRADE extends Fragment {


public TRADE () {
    // Required empty public constructor
}
ArrayList<NewsItem> newsItemsList;

ListView ali;
NewsAdaptor adapter;

@Override
public View onCreateView ( LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState ) {
    View view= inflater.inflate(R.layout.fragment_trade, container, false);
      newsItemsList = new ArrayList<>();
      ali = (ListView)view. findViewById(R.id.listtrade);
       RequestQueue requestQueue = Volley.newRequestQueue(getContext());
      StringRequest stringRequest = new StringRequest("https://urdu.geo.tv/rss/1/3", new Response.Listener <String>() {
        @Override
        public void onResponse ( String response ) {
            Document document = Jsoup.parse(response);
            Elements itemElements = document.getElementsByTag("item");
            for (int i = 0; i < itemElements.size(); i++) {
                Element item = itemElements.get(i);
                String title = rem(item.child(0).text());

                NewsItem news = new NewsItem();
                news.title = title;
                newsItemsList.add(news);
            }
            adapter = new NewsAdaptor(getContext(), newsItemsList);
            ali.setAdapter(adapter);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse ( VolleyError error ) {


        }
    });
    requestQueue.add(stringRequest);
  public void setColor(int color) 
  adapter.setTextColor(color); 
  adapter.notifyDataSetChanged(); }

SPORT.java

public class TRADE extends Fragment {


public SPORT() {
    // Required empty public constructor
}
ArrayList<NewsItem> newsItemsList;

ListView ali;
NewsAdaptor adapter;

@Override
public View onCreateView ( LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState ) {
    View view= inflater.inflate(R.layout.fragment_trade, container, false);
      newsItemsList = new ArrayList<>();
      ali = (ListView)view. findViewById(R.id.listtrade);
       RequestQueue requestQueue = Volley.newRequestQueue(getContext());
      StringRequest stringRequest = new StringRequest("https://urdu.geo.tv/rss/1/3", new Response.Listener <String>() {
        @Override
        public void onResponse ( String response ) {
            Document document = Jsoup.parse(response);
            Elements itemElements = document.getElementsByTag("item");
            for (int i = 0; i < itemElements.size(); i++) {
                Element item = itemElements.get(i);
                String title = rem(item.child(0).text());

                NewsItem news = new NewsItem();
                news.title = title;
                newsItemsList.add(news);
            }
            adapter = new NewsAdaptor(getContext(), newsItemsList);
            ali.setAdapter(adapter);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse ( VolleyError error ) {


        }
    });
    requestQueue.add(stringRequest);
    public void setColor(int color) 
    adapter.setTextColor(color); 
    adapter.notifyDataSetChanged(); }

newsitemlist_layout.xml

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

<TextView
    android:id="@+id/textView1id"
    android:layout_width="237dp"
    android:layout_height="83dp"
    android:layout_alignEnd="@+id/pubDateid"
    android:layout_alignParentTop="true"
    android:layout_alignRight="@+id/pubDateid"
    android:ellipsize="end"
    android:gravity="right"
    android:text="News TITLE"
    android:textSize="18sp"
    android:textStyle="bold" />

    </RelativeLayout>

【问题讨论】:

    标签: android


    【解决方案1】:

    我认为您并没有对适配器说您进行了更改。

    public void setTextColor(int color) {
        this.color = color;
        notifyDataSetChanged()
    }
    

    希望对你有帮助。

    【讨论】:

    • 问题是适配器没有在它在片段中初始化的主要活动中初始化。所以在每个片段中都需要像 public void setColor(int color) { adapter.setTextColor(color);适配器.notifyDataSetChanged();并且它主要活动选项菜单 Fragment fragment=new Fragment(); fragment.setColor(Color.BLACK);
    【解决方案2】:

    在 MainActivity 中:

    @SuppressLint("ResourceType")
    @Override
    public boolean onOptionsItemSelected ( MenuItem item ) {
    
        int id = item.getItemId();
        if (id == R.id.chagecolor) {
            adaptor.setTextColor(Color.GREEN);
            adaptor.notifyDataSetChanged();
        }
        return super.onOptionsItemSelected(item);
    }
    

    当调用adaptor.setTextColor(Color.GREEN); 时,adaptor 字段为null,因为您从未设置它。在 MainActivity 的某个地方你必须做adaptor=...

    【讨论】:

    • adaptor=... 我刚刚编辑的一些想法是我的问题的首要问题,您可以检查一下
    • 您有 2 个变量:adaptoradapter。一个在 MainActivity 中并且永远不会初始化,第二个在您的 Fragment 中。所以在MainActivity中初始化一个,问题就解决了。但是我不知道如果Adapter是由Fragment管理的,为什么在MainActivity中需要它
    • 没问题,如果使用 setHasOptionsMenu(true),选项菜单点击应该改变文本颜色;它片段它改变一个片段的颜色需要改变所有标签的文本颜色
    • 在选项菜单上单击需要传递文本颜色的值并更改文本颜色
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2013-05-17
    相关资源
    最近更新 更多