마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

일기장앱 제작중 RecyclerView 질문

0 추천

https://codeasy.tistory.com/29에 있는 내용을 기반으로 따라하였습니다.

public class MainActivity extends AppCompatActivity {
    public enum Month {
        JAN("Jan", 1),
        FEB("Feb", 2),
        NOV("Nov", 11),
        DEC("Dec", 12);

        private String monthString;
        private int monthInt;

        Month(String month, int i) {
            monthString = month;
            monthInt = i;
        }

        public static int ToInt(String Input) {
            for (Month m : values()) {
                if (m.monthString.equals(Input)) {
                    return m.monthInt;
                }
            }
            return 1;
        }
    }
    @BindView(R.id.horizontal_scroll_view)
    RecyclerView horizontalScrollView;
    @BindView(R.id.main_year)
    TextView tvYear;
    @BindView(R.id.main_month)
    TextView tvMonth;
    @BindView(R.id.main_list)
    RecyclerView listMain;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private List<String> months = new ArrayList();
    private List<String> years = new ArrayList<>();
    @OnClick(R.id.today)
    public void onClickAdd() {
        Calendar cal = Calendar.getInstance();
        tvYear.setText(String.valueOf(cal.get(Calendar.YEAR)));
        tvMonth.setText(new SimpleDateFormat("MMM", Locale.ENGLISH).format(cal.get(Calendar.MONTH)));
    }
    @OnClick(R.id.main_month)
    public void onClickMonth() {
        horizontalScrollView.setAdapter(new SimpleStringRecyclerViewAdapter
                (new SimpleStringRecyclerViewAdapter.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position, String value) {
                        tvMonth.setText(value);
                        horizontalScrollView.setVisibility(View.GONE);
                        //refreshList();
                    }
                }, months));
        Animation animation = new AlphaAnimation(0, 1);
        animation.setDuration(1000);
        horizontalScrollView.setVisibility(View.VISIBLE);
        horizontalScrollView.setAnimation(animation);
    }

    @OnClick(R.id.main_year)
    public void onClickYear() {
        horizontalScrollView.setAdapter(new SimpleStringRecyclerViewAdapter
                (new SimpleStringRecyclerViewAdapter.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position, String value) {
                        //list item was clicked
                        tvYear.setText(value);
                        horizontalScrollView.setVisibility(View.GONE);
                        //refreshList();
                    }
                }, years));
        Animation animation = new AlphaAnimation(0, 1);
        animation.setDuration(1000);
        horizontalScrollView.setVisibility(View.VISIBLE);
        horizontalScrollView.setAnimation(animation);
    }
    @OnClick(R.id.memo_add)
    public void onClickMemoAdd() {
        Intent intent = new Intent(this, MemoActivity.class);
        startActivity(intent);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        Calendar cal = Calendar.getInstance();
        String dateMonth = new SimpleDateFormat("MMM", Locale.ENGLISH).format(cal.get(Calendar.MONTH) + 1);
        String dateYear = String.valueOf(cal.get(Calendar.YEAR));
        tvMonth.setText(dateMonth);
        tvYear.setText(dateYear);
        mLayoutManager = new LinearLayoutManager(this);
        mAdapter
                = new MainAdapter(Integer.valueOf(tvYear.getText().toString()), Month.ToInt(tvMonth.getText().toString()));
        listMain.setLayoutManager(mLayoutManager);
        listMain.setAdapter(mAdapter);
        String[] monthList = new DateFormatSymbols(Locale.ENGLISH).getShortMonths();
        for (int j = 0; j < 12; j++) {
            months.add(monthList[j]);
        }
        for (int j = 0; j < 10; j++) {
            int a = 2010;
            years.add("" + (a + j));
        }
        LinearLayoutManager horizontalLayoutManager
                = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        horizontalScrollView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));
        horizontalScrollView.setLayoutManager(horizontalLayoutManager);
    }
    @Override
    public void onBackPressed() {
        if (horizontalScrollView.getVisibility() == View.VISIBLE) {
            horizontalScrollView.setVisibility(View.GONE);
        } else {
            super.onBackPressed();
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
    }
}

activity_main.xml에 있는 RecyclerView(id : main_list)의 list_item을 안넣어줘서 그런가요..?

고수분들 Help

꿀개 (2,440 포인트) 님이 2019년 9월 19일 질문
에러코드입니다.
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 5618
    java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)
        at butterknife.internal.DebouncingOnClickListener.<clinit>(DebouncingOnClickListener.java:12)
        at com.example.myapplication.MainActivity_ViewBinding.<init>(MainActivity_ViewBinding.java:40)
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at butterknife.ButterKnife.bind(ButterKnife.java:170)
        at butterknife.ButterKnife.bind(ButterKnife.java:99)
        at com.example.myapplication.MainActivity.onCreate(MainActivity.java:145)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

1개의 답변

0 추천
ButterKnife 바인딩 오류인것 같으니, 바인딩은 시켜놨는데, 레이아웃 파일에는 없는 뷰가 있는지 찾아보세요.
쎄미 (162,410 포인트) 님이 2019년 9월 20일 답변
해당바인드 뷰 시킨 id들은 전부 다 있는 건데 왜 이런 오류가 발생하는지 모르겠습니다. 다만 레이아웃에서 recyclerview가 두개가 있고,나머지는 그냥 textview입니다.
ButterKnife.bind(this);
이쪽에서 에러가 나는 것 같아요..ㅠㅠ
다른 부분의 코드는 다 주석처리하고 onCreate() 만 남겨놓거나 하는 식으로 하나씩 찾아가 보세요.
답변해주셔서 정말 감사합니다!!
에러랑 애뮬레이터 에러가 이렇게 나오는데 어떤 뜻인지 잘모르겠네요ㅠㅠㅠ 구글링해서 찾아봤는데 어떤 문제인지도 잘 모르겄구...
에러
C:\AndroidStudioProjects\MyApplication\app\src\main\java\com\example\myapplication\MainActivity.java:
uses unchecked or unsafe operations.
Recompile with -Xlint:unchecked for details.

애뮬레이터 Event Log
오전 9:55    Emulator: dsound: Could not initialize DirectSoundCapture

오전 9:55    Emulator: dsound: Reason: No sound driver is available for use, or the given GUID is not a valid DirectSound device ID

오전 9:55    Emulator: dsound: Attempt to initialize voice without DirectSoundCapture object

오전 9:55    Emulator: dsound: Attempt to initialize voice without DirectSoundCapture object

오전 9:55    Emulator: audio: Failed to create voice `goldfish_audio_in'

오전 9:55    Emulator: C:\Users\gpm\AppData\Local\Android\Sdk\emulator\qemu\windows-x86_64\qemu-system-x86_64.exe: warning: opening audio input failed

오전 9:55    Emulator: dsound: Attempt to initialize voice without DirectSoundCapture object

오전 9:55    Emulator: dsound: Attempt to initialize voice without DirectSoundCapture object

오전 9:55    Emulator: audio: Failed to create voice `adc'

오전 9:55    Emulator: checkValid: hw configs not eq

오전 9:55    Emulator: Warning: setGeometry: Unable to set geometry 493x864+-943+167 on QWidgetWindow/'EmulatorContainerClassWindow'. Resulting geometry:  394x691+-943+167 (frame: 0, 0, 0, 0, custom margin: 0, 0, 0, 0, minimum size: 200x200, maximum size: 16777215x16777215). ((null):0, (null))

오전 9:55    Emulator: Warning: setGeometry: Unable to set geometry 67x531+-475+167 on QWidgetWindo

오전 9:55    Emulator: w/'ToolControlsWindow'. Resulting geometry:  54x425+-475+167 (frame: 0, 0, 0, 0, custom margin: 0, 0, 0, 0, minimum size: 67x531,

오전 9:55    Emulator: maximum size: 67x531). ((null):0, (null))

오전 9:55    Emulator: Critical: UpdateLayeredWindowIndirect failed for ptDst=(-897, 167), size=(300x21), dirty=(300x21 0, 0) (시스템에 부착된 장치가 작동하지 않습니다.) ((null):0, (null))
다른 에러는 다른 질문으로 올리시고, 저 에러부터 고치세요.
...