2016-04-15 88 views
0

所以我一直在搞亂RecyclerView,並且我已經在Activity中正確正確地工作了;但只要我在Fragment中嘗試它,它就不會更新UI。RecyclerView適配器沒有在片段中更新

MainActivity.java

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.design.widget.TextInputEditText; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

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

    public class MainActivity extends AppCompatActivity implements AddItemDialog.OnItemAddedListener { 

    private FloatingActionButton fab; 

    private FragmentManager manager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RecyclerFragment rvf = new RecyclerFragment(); 
     manager = getSupportFragmentManager(); 
     FragmentTransaction ft = manager.beginTransaction(); 
     ft.add(R.id.frag_container, rvf, "TAG"); 
     ft.commit(); 

     fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
      AddItemDialog dialog = new AddItemDialog(); 
       dialog.show(getSupportFragmentManager(), "DIALOG"); 
      } 
     }); 
     fab.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       Intent intent = new Intent(getBaseContext(), _3DTouch.class); 
       startActivity(intent); 
       return true; 
      } 
     }); 

     if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); 
     } 

     if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 2); 
     } 
    } 

    @Override 
    public void onDialogPositiveClick(String entry) { 
     RecyclerFragment rvfFrag = (RecyclerFragment) getSupportFragmentManager().findFragmentByTag("TAG"); 
     rvfFrag.refreshData(entry); 
    } 

    @Override 
    public void onDialogNegativeClick() {} 
} 

FragmentAdapter.java

import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

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

/** 
* Created by jfelt on 15/04/2016. 
*/ 
public class FragmentAdapter extends RecyclerView.Adapter<FragmentAdapter.ViewHolder> { 

    private List<TestEntry> testEntries = Collections.emptyList(); 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     TextView textView; 

     ViewHolder(View itemView) { 
      super(itemView); 
      textView = (TextView) itemView.findViewById(R.id.rv_item); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return testEntries.size(); 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup vg, int i) { 
     View v = LayoutInflater.from(vg.getContext()).inflate(R.layout.entry, vg, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder vh, int i) { 
     vh.textView.setText(testEntries.get(i).getItem()); 
    } 
} 

RecyclerFragment.java

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Looper; 
import android.support.annotation.Nullable; 
import android.support.annotation.UiThread; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by jfelt on 14/04/2016. 
*/ 
public class RecyclerFragment extends Fragment { 

    List<TestEntry> testEntries = new ArrayList<>(); 

    private RecyclerView recyclerView; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView.LayoutManager manager; 

    public RecyclerFragment() {} 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle args = getArguments(); 
     if (args != null) { 
      Log.d("RecyclerFragment", String.valueOf(args)); 
     } 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     recyclerView = (RecyclerView) view.findViewById(R.id.recycler); 
     manager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(manager); 
     adapter = new FragmentAdapter(); 
     recyclerView.setAdapter(adapter); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inf, ViewGroup vg, Bundle savedInstanceState) { 
     View rv = inf.inflate(R.layout.rv_layout, null); 
     return rv; 
    } 

    public void refreshData(String entry) { 
     Log.d("TAG", entry); 
     testEntries.add(new TestEntry(entry)); 
     Log.d("TAG", String.valueOf(testEntries)); 
     getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       adapter.notifyItemInserted(testEntries.size() - 1); 
      } 
     }); 
    } 
} 

記錄表明refreshData接收從對話框聽者的輸入。這個問題似乎在調用adapter.notifyItemInserted,因爲它似乎沒有被正確調用。我可能錯過了一些明顯的東西,但我一直在盯着這段代碼幾個小時,卻無法弄清楚。任何幫助是極大的讚賞。

回答

2

如何將Fragment中的testEntries引用到Adapter中的testEntries?我認爲問題是你不告訴你適配器更新的數據。我建議在Adapter中創建一個函數,將條目添加到它,然後notifyItemsInserted。

內FragmentAdapter:

public void addItem(String entry){ 
    this.testEntries.add(entry); 
    notifyItemInserted(testEntries.size() - 1); 
} 

內部片段:

((FragmentAdapter) getAdapter()).addItem(entry); 
0

FragmentAdapterRecyclerFragment我們引用了不同的列表,所以當你添加一個項目到一個它不會被添加到另一個。這將與當前的代碼結構工作

一種選擇是一個構造函數添加到FragmentAdapter,需要一個List,使它們都具有相同的List參考:

public FragmentAdapter(List<TestEntry testEntries) { 
    this.testEntries = testEntries; 
} 

,然後在你的片段通onViewCreated()在其列表中作爲FragmentAdapter構造函數的參數。

adapter = new FragmentAdapter(testEntries); 

而且你不需要getActivity().runOnUiThread,因爲你已經在這一點上,UI線程上。您只需撥打電話即可添加該項目。

testEntries.add(new TestEntry(entry)); 
adapter.notifyItemInserted(testEntries.size() - 1); 
相關問題